春季安全自定义登录方法不支持
我在我的小项目中采用了spring security。 我有一个问题,当我尝试使用POST方法提交表单来登录时,弹簧安全HTTP 405错误(POST不支持)被引发。春季安全自定义登录方法不支持
这是我的代码如下。
春季安全AppContext:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
<http security="none" pattern="/resources/**" />
<http security="none" pattern="/home/testpage" />
<http security="none" pattern="/user/join-form" />
<http security="none" pattern="/user/join" />
<http security="none" pattern="/user/activate-user" />
<http security="none" pattern="/user/login-form" />
<http security="none" pattern="/user/check-duplication-email" />
<http security="none" pattern="/user/check-duplication-nickname" />
<http use-expressions="true" auto-config="true">
<intercept-url pattern="/home/main" access="permitAll"/>
<form-login
login-page="/user/login-form"
default-target-url="/home/main"
authentication-failure-handler-ref="authenticationFailureHandler"
username-parameter="email"
password-parameter="passwd"
login-processing-url="/user/login"
/>
<csrf/>
<logout
logout-url="/user/logout"
invalidate-session="true"
logout-success-url="/user/login-form"
/>
<session-management>
<concurrency-control max-sessions="1" expired-url="/" />
</session-management>
</http>
<authentication-manager>
<authentication-provider ref="authenticationProvider" />
</authentication-manager>
<beans:beans profile="common">
<beans:bean id="authenticationProvider" class="com.winsplay.whiteboard.web.auth.CustomAuthenticationProvider" >
<beans:property name="userSecurityService" ref="userSecurityService" />
</beans:bean>
<beans:bean id="authenticationFailureHandler" class="com.winsplay.whiteboard.web.auth.CustomAuthenticationFailureHandler" />
<beans:bean id="userSecurityService" class="com.winsplay.whiteboard.web.auth.UserSecurityServiceImpl" />
<mybatis-spring:scan base-package="com.winsplay.whiteboard.web.auth" annotation="org.springframework.stereotype.Repository"/>
</beans:beans>
</beans:beans>
JSP登录表单:
<c:if test="${anonymous}">
<div id="login-popup">
<p class="info">login</p>
<hr />
<form:form action="${pageContext.request.contextPath}/user/login" method="post">
<sec:csrfInput/>
<p><form:errors /></p>
<table>
<tbody>
<tr>
<td style="text-align:right;"><p class="input-header">email</p></td>
<td>
<input type="email" class="myinput" name="email" placeholder="[email protected]" />
</td>
<td rowspan="2" style="vertical-align:top;">
<input type="image" style="position:relative; top:-10px;" src="${pageContext.request.contextPath}/resources/img/btn_login.JPG" alt="btn_login" title="login" />
</td>
</tr>
<tr >
<td style="text-align:right;"><p class="input-header">password</p></td>
<td>
<input type="password" class="myinput" name="passwd" />
</td>
</tr>
</tbody>
</table>
<div style="text-align:right; margin-right:100px; margin-top:30px;">
<a class="my-btn" href="${pageContext.request.contextPath}/user/find-password">find password</a>
<a class="my-btn close-lightbox" href="#">close</a>
</div>
</form:form>
<hr />
</div>
</c:if>
如何发送POST方法登录?
在此先感谢。
< HTTP安全= “无” ... >啄是根据您的安全设置,调试
问题解决。
POST不支持的问题来自AuthenticationFailureHandler,它在我的代码中调用“setUseForward(true)”。
首先,我将错误的密码参数传递给服务层,并返回false,使得引发BadCredentialException。而异常是转发到AuthenticationFailureHandler。由于我定制了类,我调用了“setUseForward(true)”,它使用POST方法转发请求,并且持有该URL的控制器不接受POST方法。
下面的代码是一个真正的原因。
@RequestMapping("...", method = RequestMethod.GET)
,你应该改变这样的:
login-processing-url="/user/login"
这样:
login-processing-url="/login"
或login-processing-url="/j_spring_security_check"
并将您的登录表单操作更改为:
/login
或/j_spring_security_check
取决于您的设置。
这发生,因为春天找不到令牌处理过滤器,如果更改,那么春天将直接进入您的CustomAuthenticationProvider
P/S:如果你的表格无法找到动作的网址,你可以使用c
或spring
标签库。
不,login-processing-url可以正常使用“/ user/login”。此外,我解决了这个问题。请检查我的答案。 – PLAYMAKER
这可能会发生,因为您需要在login.jsp表单中传递CSRF令牌。尝试在您的表单标记 – smoggers