SpringSecurity 登录页面无法获取CSRF令牌的解决方法

捡重要的说
配置说明:项目是基于maven+springMVC+springSecurity的,maven、web.xml和springmvc具体配置可以百度,具体说下springsecurity.xml的配置,

<http pattern="/init" security="none"/>
<http pattern="/login" security="none"/>

<http auto-config="true">
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
    <form-login
            login-page="/login"
            default-target-url="/welcome"
            authentication-failure-url="/login?error"
            username-parameter="uname"
            login-processing-url="/j_spring_security_check"
            password-parameter="pwd" />
    <logout logout-success-url="/login?logout"  />
    <csrf/>
</http>

如代码所示,我过滤了2条url请求的验证后拦截所有的url请求,springsecurity是4.2.2,由于csrf在4.x之后默认开启,我也就不关闭了,登录页面jsp代码

    <form name='loginForm' action="<c:url value='j_spring_security_check' />" method='POST'>
            <table>
                <form:form>
                <tr>
                    <td>User:</td>
                    <td><input type='text' name='uname' value=''></td>
                </tr>
                <tr>
                    <td>Password:</td>
                    <td><input type='password' name='pwd' /></td>
                </tr>
                <tr>
                    <td colspan='2'><input name="submit" type="submit"  value="submit" /></td>
                </tr>
                </form:form>
            </table>
            <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
        </form>

jsp页面代码中有csrf参数,但是当访问 /login的时候,检查页面源码中发现没有csrf参数,这就奇怪了,因为当springsecurity配置改为
 <http pattern="/init" security="none"/>
    <!--<http pattern="/login" security="none"/>-->
    <http auto-config="true">
        <intercept-url pattern="/admin" access="hasRole('ROLE_USER')" />
        <form-login
                login-page="/login"
                default-target-url="/welcome"
                authentication-failure-url="/login?error"
                username-parameter="uname"
                login-processing-url="/j_spring_security_check"
                password-parameter="pwd" />
        <logout logout-success-url="/login?logout"  />
        <csrf/>
    </http>
    login页面的就有了csrf令牌了。猜测是配置问题,debug之后发现了第一个配置文件的时候,/login过springspecrutiy过滤器时的过滤器链为0,而第二个配置的过滤器链过滤器为13,在这13个过滤器中,有一个过滤器名字为CsrfFilter,这个就是csrf令牌验证过滤器。在这个过滤器中,会先往request请求中放一个token对象,这个对象包含如下参数:
        ![debug下的CsrfFilter文件](https://img-blog.csdn.net/20170321104717410?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3FxTGFpMTIzNDU2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
      因此,如果直接过滤掉login请求,则springsecurity无法将token放入jsp页面,该页面无论怎么样也无法获取csrf令牌了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值