在看一下session的管理
我们只需要在http中配置session-management就可以了。那我们仔细看一下这个标签吧
session-fixation-protection是为了防止固化攻击的.
一般来说我们会配置成migrateSession的。 这个比较保险而且好用。
在看一下spring security是如何对session进行并发控制的。
<http auto-config="true" use-expressions="true">
<!-- ... -->
<session-management>
<concurrency-control max-sessions="1"/>
</session-management>
</http>
这是让当前这个session的控制量最大是1,这个还是不够的,
“
我 们 需 要 在 web.xml 描 述 文 件 中 配 置 中 使 得o.s.s.web.session.HttpSessionEventPublisher生效,这样servelt 容器将会通知Spring Security session生命周期的事件(通过HttpSessionEventPublisher)。
”
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
书中提到了这样的一段话:
"
Session并发控制使用o.s.s.core.session.SessionRegistry来维护一个活跃HTTP session的列表而认证过的用户与其进行关联。当session创建或过期时,注册表中会实时进行更新,基于HttpSessionEventPublisher发布的session 生命周期事件来跟踪每一个认证用户的活动session的数量。
"
看到上边那个session的监听机制,这里有一个很重要的累叫做SessionRegistry.我们通过这个类进行session的维护。HttpSessionEventPublisher监听每一个session声明周期然后通过ApplicationListenter给SessionRegistry,然后SessionRegistry就可以进行记录session了。(非常有意思的一个类,这个类里边我们肯定可以获取信息)。
接下来我们就可以验证一下了:
“
如同验证session固化攻击那样,我们需要访问两个web浏览器。按一下的步骤:
1. 在IE 中,以guest用户登录;
2. 接下来,在Firefox中,以相同的用户(guest)登录;
3. 最后,返回到IE 中,做任何的动作都可以。你会发现有一个信息提示你的session
已经过期了。
1. 在IE 中,以guest用户登录;
2. 接下来,在Firefox中,以相同的用户(guest)登录;
3. 最后,返回到IE 中,做任何的动作都可以。你会发现有一个信息提示你的session
已经过期了。
”
还可以设置他的session过期重定向地址。
<session-management>
<concurrency-control max-sessions="1" expired-url= "/login.do?error=expired"/>
</session-management>
在回忆一下刚才说过的SessionRegister么。 肯定能从中获取一些信息。
for (Object principal : principals) {
List<SessionInformation> sessionInformationList = sessionRegistry.getAllSessions(principal, false);
for(SessionInformation sessionInfo : sessionInformationList){
System.out.println(sessionInfo.getPrincipal());
}
}
看一下都可以从sessionInformation中获取什么信息:
看到了,我们可以获取User的信息.
这里有个方法我们需要查一下api:
这样一看,挺有意思了,呵呵。又进步一点了。。