升级到3.2.0.RC2后,Spring Security无法正常工作

时间:2013-11-05 16:08:45

标签: spring-mvc spring-security

我刚从Spring Security 3.2.0.RC1升级到3.2.0.RC2。在RC1下一切正常。在RC2下,我的自定义登录页面不再有效。单击“登录”按钮后,刚刚重新登录登录页面。如果提交了无效凭证(或没有凭据),它也会重新显示,而不会显示任何错误消息。如果凭据不正确,它将正确显示错误消息。

有趣的是,如果我改变:

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    // @formatter:off

    httpSecurity
        .authorizeRequests()
            .antMatchers("/restricted/**").hasRole("admin"))
            // all requests must be authenticated
            .anyRequest().authenticated()
    .and()
        .formLogin()
            .loginPage("/myLoginUrl.request")
            .failureUrl("/myLoginUrl.request?error")
            .permitAll()
    .and()
        .logout()
            .permitAll()
            .logoutSuccessUrl("/myLoginUrl.request")
    ;
    // @formatter:on
}

为:

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    // @formatter:off

    httpSecurity
        .authorizeRequests()
            .antMatchers("/restricted/**").hasRole("admin"))
            // all requests must be authenticated
            .anyRequest().authenticated()
    .and()
        .formLogin()
            .permitAll()
    .and()
        .logout()
            .permitAll()
            .logoutSuccessUrl("/myLoginUrl.request")
    ;
    // @formatter:on
}

默认的Spring Security登录页面显示并有效。我查看了默认页面的来源,并将其与我的自定义页面进行了比较,似乎使用相同名称的字段调用相同的操作。

如果我单步执行调试器,我发现在AntPathMatcher.java中,公共布尔匹配(HttpServletRequest请求):

String url = getRequestPath(request)

使用我的自定义登录页面时返回的网址是“/ error”。 getRequestPath()只返回附加到request.getPathInfo()的request.getServletPath()。我不确定为什么升级到RC2会导致返回“/ error”。

1 个答案:

答案 0 :(得分:1)

我改变了三件让它发挥作用的事情。

1)在表单中添加了一个CSRF隐藏字段:

<input type="hidden" name="${_csrf.parameterName}"
    value="${_csrf.token}" /> 

2)表单方法的大写POST:

<form action="login" method="POST">

3)将loginProcessingUrl明确添加到配置中:

.formLogin()
        .loginPage("/myLoginUrl.request")
        .loginProcessingUrl("/login")
        .failureUrl("/myLoginUrl.request?error")
        .permitAll()
相关问题