同一个用户使用不同的浏览器登录,将会导致什么结果呢?Spring Security提供了多种选项。
<!-- session管理 --> <sec:session-management session-fixation-protection="changeSessionId" session-authentication-error-url="/login/session_error.action?id=max_session_error" invalid-session-url="/login/session_error.action?id=invalid_session_error" > <sec:concurrency-control max-sessions="1" expired-url="/login/session_error.action?id=session_expired_error" error-if-maximum-exceeded="false" /> </sec:session-management>
session-management配置的最终效果受到session-fixation-protection属性和max-sessions属性以及error-if-maximum-exceeded属性的共同影响。
(1)对于session-management标签的session-fixation-protection属性,Eclipse给出的API DOC信息如下:
Attribute : session-fixation-protection
Indicates how session fixation protection will be applied when a user authenticates. If set to
"none", no protection will be applied. "newSession" will create a new empty session, with only
Spring Security-related attributes migrated. "migrateSession" will create a new session and copy
all session attributes to the new session. In Servlet 3.1 (Java EE 7) and newer containers,
specifying "changeSessionId" will keep the existing session and use the container-supplied
session fixation protection (HttpServletRequest#changeSessionId()). Defaults to
"changeSessionId" in Servlet 3.1 and newer containers, "migrateSession" in older containers.
Throws an exception if "changeSessionId" is used in older containers.
session-fixation-protection属性有4个可能的值用来控制用户在登录前后的session特征。
(a)none:不进行Session fixation固化保护。
(b)newSession:创建新的session,仅仅Spring Security相关的属性会迁移到新的session。
(c)migrateSession:创建新的session,所有属性会迁移到新的session。
(d)changeSessionId:保留登录之前的session不变。
(2)max-sessions属性控制同一个用户的最多的session个数,当为1时,只能某个浏览器上处于已登录状态。当为-1时表示不受限制。
(3)error-if-maximum-exceeded属性控制是否在用户的已登录session的个数超出max-sessions时报告错误。
true:该用户已登录的session个数超出时报告错误导致登录失败,跳转到
session-authentication-error-url指定URL。
false:超出时不报告错误,但是会导致之前已经登录的session失效过期,之前已经登录的session在做任何页面跳转操作时会跳转到expired-url指定的URL。
API DOC原文如下:
Specifies that an unauthorized error should be reported when a user attempts to login when they
already have the maximum configured sessions open. The default behaviour is to expire the original session. If the session-authentication-error-url attribute is set on the session-management URL, the user will be redirected to this URL
(4)invalid-session-url。
在设置了此属性的情况下,在用户先前的登录session被后面的登录session挤掉之后,先前的session无效了。此时在先前登录的浏览器中进行页面跳转操作时,将会跳转到invalid-session-url指定的URL。
(5)session-authentication-error-url。在error-if-maximum-exceeded为true时,如果session个数超出限制则使用此URL来报告错误。但是,如果form-login结点配置了authentication-failure-url这个属性,则会以form-login结点的配置为准。
(6)expired-url。
用于控制在登录session被后来的登录session挤掉后,再在先登录session中进行页面跳转时,将跳转到expired-url指定的URL。
使用过程中发现如下现象:
在设置了invalid-session-url时,没发现跳转到此URL的情况,在再次登录时都是跳转到了invalid-session-url。在没有设置invalid-session-url时,才跳转到expired-url。
API DOC:
The URL a user will be redirected to if they attempt to use a session which has been "expired"
because they have logged in again.