2016-08-14 160 views
0

我在我的小项目中采用了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安全= “无” ... >啄是根据您的安全设置,调试

+0

这可能会发生,因为您需要在login.jsp表单中传递CSRF令牌。尝试在您的表单标记 – smoggers

+0

<秒内添加,它不起作用。当我进入我的网站时,我可以很好地检查csrf token set – PLAYMAKER

回答

0

问题解决。

POST不支持的问题来自AuthenticationFailureHandler,它在我的代码中调用“setUseForward(true)”。

首先,我将错误的密码参数传递给服务层,并返回false,使得引发BadCredentialException。而异常是转发到AuthenticationFailureHandler。由于我定制了类,我调用了“setUseForward(true)”,它使用POST方法转发请求,并且持有该URL的控制器不接受POST方法。

下面的代码是一个真正的原因。

@RequestMapping("...", method = RequestMethod.GET) 
0

,你应该改变这样的:

login-processing-url="/user/login" 

这样:

login-processing-url="/login"login-processing-url="/j_spring_security_check"

并将您的登录表单操作更改为:

/login/j_spring_security_check取决于您的设置。

这发生,因为春天找不到令牌处理过滤器,如果更改,那么春天将直接进入您的CustomAuthenticationProvider

P/S:如果你的表格无法找到动作的网址,你可以使用cspring标签库。

+0

不,login-processing-url可以正常使用“/ user/login”。此外,我解决了这个问题。请检查我的答案。 – PLAYMAKER