spring security入门--会话管理

11 篇文章 0 订阅
6 篇文章 3 订阅

1.说明

程序代码采用之前(spring security入门--自定义UserDetails实现用户登录访问简单示例五)文章中的代码,本篇文章值给出修改部分的代码,详细代码请查看往期文章。

地址:https://blog.csdn.net/qq_32224047/article/details/108615301

2.会话理解

会话(session)就是无状态HTTP实现用户状态可维持的一种解决方案。HTTP本身的无状态使得用户在与服务器的交互过程中,每个请求之间都没有关联性。这意味着用户得访问没有身份记录。站点也无法为用户提供个性化的服务。session的诞生解决了这个难题,服务器通过与用户约定每一个请求都携带一个id类的信息,从而让不同请求之间有了关联,而id又可以很方便的绑定具体用户,所以我们可以把不同请求归类到同一个用户。基于这个方案,为了让用户每一个请求都携带一个id,在不妨碍体验的情况下,cookie是很好的载体。当用户首次访问系统时,系统会为该用户生成一个sessionId,并添加到cookie中。在该用户的会话期内,每个请求都自动携带cookie,因此系统可以很轻松的识别出这事来自哪个用户的请求。

3.会话并发控制

在spring security供,提供管理会话的功能,其中会话的并发控制是比较完善的。当一个用户在spring security工程做了认证登录,客户端浏览器存储sessionId值,那么并不影响其他不同客户端使用相同用户名密码访问系统,这样一来同一个认证用户可以在不同的客户终端同时使用享受用户权限。这种情况对一些软件和系统来讲是不允许的。例如,购买了vip权限的视频账号,可以同时有500个人在线享受vip权限,却只需要购买一次。所以需要会话并发来控制。

实现Spring security的会话并发是非常容易的。只需要在过滤授权http方法链上添加管理会话的内容即可 。

在之前的配置类MyWebSecurityConfig中添加代码

maximumSessions设置最大会话并发,下面代码设置同一个用户最多1个sessionId.

这样我们可以允许一个用户同时存在于系统的session最多可以有一个。当认证登录实现之后,security数据内存里保管了一个UserDetail对象.会话管理中保存以UserDetails为key值,以对应sessionId为value的一个list.security根据定义的会话管理最大会话并发数限制同一个用户的list value中的元素个数

 http.sessionManagement().maximumSessions(1);

用户认证的对象如果使用的是security中的User[org.springframework.security.core.userdetails.User]来作为用户认证使用的对象,这个会话并发控制是有效的,因为在它提供的User中已经重写了equals()方法和hashCode()方法。

如果我们使用自定义UserDetails,必须重写equals()和hashCode()方法.原因是因为spring security底层判断2次登录是否是同一个用户,使用的是一个map对象。而map对象的value就是最大会话并发的一个set,key值就是user对象。判断对象是否是map的同一个key值,当然使用的是equals和hashCode方法,所以自定义UserDetails的话不重新定义这2个方法,永远在同一个用户登录时,底层判断是不相等的 

自定义的UserDetails,重写的代码如下

测试验证

先用火狐浏览器登录admin

 访问成功

换ie浏览器登录admin

 点击登录,可以看到已经被限制

4.集群会话管理 

在上述过程中没有使用集群,在使用集群的情况下会出现session共享的问题。spring security作为认证登录服务器,使用session的管理控制并发整个过程结束后,我们不难联想,session作为服务器内存数据,一定会在集群时出现共享的问题。那么很庆幸,spring解决了session共享的问题,使用的技术叫做spring session。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值