-1

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

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

4

2 回答 2

0

您的问题有点不清楚,或者您对 spring security 如何记住我有一个错误的形象。阅读 Spring Security 参考第 11 章“Remember-Me 身份验证”

简而言之,它是这样工作的:

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

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

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

我希望这可以帮助你。

于 2012-09-14T07:02:14.007 回答
0

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

当我们更改登录表单(添加另一个参数)时,我们需要自定义登录表单的 spring 表示和 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,包装了获取请求参数的尝试身份验证方法并将其存储在 http 会话中。编写这个类只是为了展示这个想法,为了更好地练习浏览 AuthenticationProcessingFilter 代码以获取用户名和密码参数。

公共类 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 一起定义了由 element inside 定义的参数。当您想要默认行为时使用。但在我们的例子中,我们使用自定义 bean,因此您应该完全删除元素。现在我们需要告诉使用我们的bean。“myFilter” bean 通过使用 bean 定义中的元素传递给 spring 链:

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

“entryPoint”被传递给 using 属性:

<http entry-point-ref="entryPoint">
    ...
    <!-- no form-login here -->
</http>
于 2012-09-14T13:49:20.823 回答