【发布时间】:2012-07-19 12:34:54
【问题描述】:
我有登录成功和重定向到页面的奇怪问题。
下面是我的 spring 安全配置。
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/login.hst**" access="anonymous or authenticated" />
<intercept-url pattern="/**/*.hst" access="authenticated" />
<form-login login-page="/login.hst"
authentication-failure-url="/login.hst?error=true"
authentication-success-handler-ref="loginSucessHandler" />
<logout invalidate-session="true" logout-success-url="/home.hst"
logout-url="/logout.hst" />
<remember-me key="jbcpHaverERP" authentication-success-handler-ref="loginSucessHandler"/>
<session-management>
<concurrency-control max-sessions="1" />
</session-management>
</http>
LoginSuessHandler 类:
@Service
public class LoginSucessHandler extends
SavedRequestAwareAuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws ServletException, IOException {
...
super.setUseReferer(true);
super.onAuthenticationSuccess(request, response, authentication);
}
}
现在成功重定向到请求页面的问题。如果我直接引用任何安全 url,spring 会将我重定向到登录页面并成功登录到原始请求的链接。 但是,如果用户之前选择了记住我,然后关闭浏览器并现在请求直接 URL,则这不起作用,他正在正确地进行身份验证,而不是将他重定向到请求的页面弹簧重定向到 /。我检查了日志和一些 spring 源代码,发现它无法确定目标 url。
我已尝试设置refer,但referer 值为空。但是我注意到一件奇怪的事情,在 spring 安全配置中,如果我从 remember-me 配置中删除 authentication-success-handler ,那么它就可以工作。
<remember-me key="jbcpHaverERP" authentication-success-handler-ref="loginSucessHandler"/>
无法找出问题。表单登录和记住我的身份验证成功处理程序实现是否需要不同?
【问题讨论】:
-
spring security的版本是多少? 3.1 还是 3.0?您是否将属性 alwaysUseDefaultTargetUrl 设置为 true?
-
我正在使用 Spring Security 3.1。是的,我使用了属性 alwaysUseDefaultTargetUrl。如果我将此设置为 true,那么它总是将我重定向到 / 两种情况(记住我和正常登录)
-
我在问你版本,因为这个问题发生在我身上:我的 spring xml 文件使用 3.1 命名空间,但 pom.xml 仍然使用 3.0...对我来说糟糕的一天.. . :) 那么为什么需要自定义成功处理程序?
-
我正在使用自定义成功处理程序为登录的用户初始化某些数据,并在会话中存储一些数据。我也在管理多个标签访问using
-
你能把 maxSessions 改成大于 1 吗?此外,打开 Spring Security 的调试级别日志记录