登录失败时如何获得记住我的价值并重新打开登录页面?我可以在控制器上获取 _spring_security_remember_me 的值吗?
发生登录错误时,我只需要保留复选框的值!
登录失败时如何获得记住我的价值并重新打开登录页面?我可以在控制器上获取 _spring_security_remember_me 的值吗?
发生登录错误时,我只需要保留复选框的值!
您的问题有点不清楚,或者您对 spring security 如何记住我有一个错误的形象。阅读 Spring Security 参考第 11 章“Remember-Me 身份验证”
简而言之,它是这样工作的:
如果用户使用他的用户名和密码成功登录并启用了记住我复选框,Spring Security 将创建一个 cookie 来验证用户并将其“发送”给用户
未登录用户请求安全页面(需要身份验证)spring 将检查他是否为有效 cookie。
我希望这可以帮助你。
您可以尝试以下解决方案: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>