Spring Security - 登录失败时请检查我

时间:2012-09-13 22:53:53

标签: spring spring-security remember-me

登录失败后如何记住我的价值并重新打开登录页面? 我可以在控制器上获得_spring_security_remember_me的值吗?

我只需要在登录错误发生时保留复选框的值!

2 个答案:

答案 0 :(得分:0)

你的问题有点不清楚,或者你有一个错误的形象,如何记住我的春季安全工作。阅读Spring安全性参考第11章“记住我的身份验证”

简单地说就是这样:

  • 如果用户使用其用户名和密码成功登录并启用了“记住我”复选框,则Spring Security将创建一个用于验证用户并将其“发送”给用户的cookie

  • 未登录用户请求安全页面(需要验证)spring将检查他是否为有效cookie。

    • 如果他有这样的cookie春天安全将“自动”“登录”他并向他显示页面
    • 如果他没有有效的cookie,则会将他转发到登录页面(见上文)

我希望这会对你有所帮助。

答案 1 :(得分:0)

您可以尝试以下解决方案: 1.将自定义过滤器插入弹簧安全过滤器链 2.在此过滤器内部获取http会话并存储请求参数的值

当我们更改登录表单(添加另一个参数)时,我们需要自定义登录表单的弹簧表示和spring登录处理过滤器。 这是配置:

<authentication-manager alias="authenticationManager"/>

<beans:bean id="myFilter" class="test.MyAuthenticationProcessingFilter">
    <custom-filter position="AUTHENTICATION_PROCESSING_FILTER" />
    <beans:property name="defaultTargetUrl" value="/initialize.action"/>
    <beans:property name="authenticationFailureUrl" value="/login_failed.action"/>
    <beans:property name="authenticationManager" ref="authenticationManager"/>
    <beans:property name="alwaysUseDefaultTargetUrl" value="true"/>
    <beans:property name="filterProcessesUrl" value="/perform_login"/>
</beans:bean>

<beans:bean id="entryPoint" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint">
    <beans:property name="loginFormUrl" value="/login.action"/>
</beans:bean>

MyAuthenticationProcessingFilter扩展了spring的org.springframework.security.ui.webapp.AuthenticationProcessingFilter,包装了tryAuthentication方法获取请求参数并将其存储在http会话中。编写此类只是为了显示该想法,为了更好地练习浏览AuthenticationProcessingFilter代码以获取用户名和密码参数。

public class MyAuthenticationProcessingFilter扩展AuthenticationProcessingFilter {

@Override
public Authentication attemptAuthentication(HttpServletRequest request)
        throws AuthenticationException {
    String param = request.getParameter("_spring_security_remember_me");

    HttpSession session = request.getSession();
    if (session != null || getAllowSessionCreation()) {
        session.setAttribute("_spring_security_remember_me", param);
    }

    return super.attemptAuthentication(request);
}

}

您可能会注意到“myFilter”和“entryPoint”bean一起定义了由内部元素定义的参数。您希望使用默认行为时使用。但在我们的例子中,我们使用自定义bean,因此您应该完全删除元素。 现在我们需要告诉我们使用我们的bean。 “myFilter”bean通过使用bean定义中的元素传递给spring链:

<beans:bean id="myFilter" class="test.MyAuthenticationProcessingFilter">
    <custom-filter position="AUTHENTICATION_PROCESSING_FILTER" />
    ...
</beans:bean>

“entryPoint”传递给使用属性:

<http entry-point-ref="entryPoint">
    ...
    <!-- no form-login here -->
</http>