Session管理的主要目标有:固定攻击的防御, 同用户并发数量的处理
1 2 3 4 5 6 7 8 9 |
<http pattern="/none/**" security="none" > </http> <http use-expressions="false"> ...... <session-management session-fixation-protection="migrateSession"> <!-- <concurrency-control max-sessions="1" expired-url="/none/sessionExpired.jsp"/> --> <concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/> </session-management> </http> |
SessionManagementFilter调用SessionAuthenticationStrategy 完成session相关活动管理,比如(session固定攻击防御, 同用户并发数量的处理),
超过了最大并发数的处理策略有两种:
策略为error-if-maximum-exceeded="true", 那么抛出异常, 再由AuthenticationFailureHandler.onAuthenticationFailure()进行处理, (如果设置了failureUrl, 那么重定向到该页面, 否则返回401状态码)
策略为expired-url, 那么会将最早的一个session设置为超时,具体通过SessionRegistry接口设置超时。
当超时的session登录时,ConcurrentSessionFilter 通过SessionRegistry 发现当前session已经超时无效, 那么重定向到expired-url="/none/sessionExpired.jsp" 配置的页面,
注意, 如果filterChain中有RememberMeAuthenticationFilter, 那么expired-url= ""数据配置的路径可能无法请求, 当执行到RememberMeAuthenticationFilter 时会按rememberMe处理而不是重定向到sessionExpired.jsp页面。这三个filter的顺序如下
ConcurrentSessionFilter->RememberMeAuthenticationFilter->SessionManagementFilter
同时我发现文档中关于HttpSessionEventPublisher的配置完全是多余的 , HttpSessionCreatedEvent和HttpSessionDestroyedEvent事件没有listener处理
Posted in: Spring Security
Comments are closed.