博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring security 个性化登录策略
阅读量:2022 次
发布时间:2019-04-28

本文共 1717 字,大约阅读时间需要 5 分钟。

最近做一个项目,安全框架采用spring security 。由于业务需要,要限制一个账户只能登录一次,不能在多个浏览器登录,也就是一个账户只能对应一个sessionid。这个很好实现,配置上默认的 session并发策略ConcurrentSessionControlAuthenticationStrategy类,设置maximumSessions值为1。代码如下:

但是这样如果账户a在一个地方登录,然后又换另外一个地方登录,后登录的会导致前一个用户session失效,也就是会踢掉前面登录的用户。这样是不允许的,而需要要求是,可以根据用户某个状态来判断,如果用户处在空闲状态,就允许同一个账号后登录的踢掉前面登录的,如果是繁忙状态就不允许登录。经过研究ConcurrentSessionControlAuthenticationStrategy类的源码,获得灵感,自定义一个SessionAuthenticationStrategy的实现类CloudqControlAuthenticationStrategy,里面增加状态判断,如果不满足条件就抛出异常,问题就可以解决了。配置代码如下:

自定义策略代码:

public class CloudqControlAuthenticationStrategy implements SessionAuthenticationStrategy {
private org.slf4j.Logger logger = LoggerFactory.getLogger(getClass()); @Override public void onAuthentication(Authentication authentication, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws SessionAuthenticationException { AuthUserDetails authUserDetails=(AuthUserDetails)authentication.getPrincipal(); Integer branchesId=authUserDetails.getClientEmpUser().getBranchesId(); Integer empId=authUserDetails.getClientEmpUser().getEmpId(); if(条件不满足){
//抛出异常 throw new SessionAuthenticationException(message); } }}

注意自定义策略的放置顺序要在其他策略前面,否则可能会造成自己的业务逻辑执行过晚,进而达不到目的。

转载地址:http://udgxf.baihongyu.com/

你可能感兴趣的文章
02.规划过程组表格-过程改进计划
查看>>
02.规划过程组表格-责任分配矩阵
查看>>
02.规划过程组表格-里程碑清单
查看>>
02.规划过程组表格-活动属性
查看>>
02.规划过程组表格-人力资源管理计划
查看>>
02.规划过程组表格-活动资源需求表
查看>>
02.规划过程组表格-风险管理计划
查看>>
02.规划过程组表格-活动持续时间估算工作表
查看>>
02.规划过程组表格-风险登记册
查看>>
02.规划过程组表格-活动持续时间估算
查看>>
02.规划过程组表格-成本管理计划
查看>>
02.规划过程组表格-风险概率和影响评估
查看>>
02.规划过程组表格-活动成本估算
查看>>
02.规划过程组表格-成本估算表
查看>>
02.规划过程组表格-质量管理计划
查看>>
02.规划过程组表格-采购管理计划
查看>>
02.规划过程组表格-供方选择标准
查看>>
02.规划过程组表格-干系管理计划
查看>>
05.收尾过程组表格-采购审计
查看>>
05.收尾过程表格-合同签收
查看>>