同一个账号,只允许一个人登录

分享 未结 精帖 3 2691
sui
sui VIP3 2018-08-30 17:55:09   最后修改:2018-08-31 00:06:18
收藏
产品:ani 版本:2.11
## 配置方式 #是否允许多账号同时登录 user.multiAccountLogin=false ## Bug修复 Jeeplus原有的Bug,造成整个系统只有一个人能登录。比如admin登陆后,test登录会造成,admin被踢掉 修改如下: [pre] /** @@ -151,10 +149,7 @@ public class CacheSessionDAO extends EnterpriseCacheSessionDAO implements Sessio Set<Session> sessions = Sets.newHashSet(); for (Session session : getActiveSessions()){ boolean isActiveSession = false; - // 不包括离线并符合最后访问时间小于等于3分钟条件。 - if (includeLeave || DateUtils.pastMinutes(session.getLastAccessTime()) <= 3){ - isActiveSession = true; - } + // 符合登陆者条件。 if (principal != null){ PrincipalCollection pc = (PrincipalCollection)session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); @@ -162,6 +157,12 @@ public class CacheSessionDAO extends EnterpriseCacheSessionDAO implements Sessio isActiveSession = true; } } + + // 不包括离线并符合最后访问时间小于等于3分钟条件。 + if (!includeLeave && DateUtils.pastMinutes(session.getLastAccessTime()) > 3){ + isActiveSession = false; + } + // 过滤掉的SESSION if (filterSession != null && filterSession.getId().equals(session.getId())){ isActiveSession = false; [/pre] 另外,由于有缓存存在因此,踢人的逻辑要换个位置 [pre] /** * 系统安全认证实现类 @@ -82,7 +77,7 @@ public class SystemAuthorizingRealm extends AuthorizingRealm { throw new AuthenticationException("msg:验证码错误, 请重试."); } } - + // 校验用户名密码 User user = getSystemService().getUserByLoginName(token.getUsername()); if (user != null) { @@ -103,23 +98,6 @@ public class SystemAuthorizingRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { Principal principal = (Principal) getAvailablePrincipal(principals); - // 获取当前已登录的用户 - if (!Global.TRUE.equals(Global.getConfig("user.multiAccountLogin"))){ - Collection<Session> sessions = getSystemService().getSessionDao().getActiveSessions(true, principal, UserUtils.getSession()); - if (sessions.size() > 0){ - // 如果是登录进来的,则踢出已在线用户 - if (UserUtils.getSubject().isAuthenticated()){ - for (Session session : sessions){ - getSystemService().getSessionDao().delete(session); - } - } - // 记住我进来的,并且当前用户已登录,则退出当前用户提示信息。 - else{ - UserUtils.getSubject().logout(); - throw new AuthenticationException("msg:账号已在其它地方登录,请重新登录。"); - } - } - } User user = getSystemService().getUserByLoginName(principal.getLoginName()); if (user != null) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); @@ -166,6 +144,24 @@ public class SystemAuthorizingRealm extends AuthorizingRealm { @Override public boolean isPermitted(PrincipalCollection principals, Permission permission) { + Principal principal = (Principal) getAvailablePrincipal(principals); + // 获取当前已登录的用户 + if (!Global.TRUE.equals(Global.getConfig("user.multiAccountLogin"))){ + Collection<Session> sessions = getSystemService().getSessionDao().getActiveSessions(true, principal, UserUtils.getSession()); + if (sessions.size() > 0){ + // 如果是登录进来的,则踢出已在线用户 + if (UserUtils.getSubject().isAuthenticated()){ + for (Session session : sessions){ + getSystemService().getSessionDao().delete(session); + } + } + // 记住我进来的,并且当前用户已登录,则退出当前用户提示信息。 + else{ + UserUtils.getSubject().logout(); + throw new AuthenticationException("msg:账号已在其它地方登录,请重新登录。"); + } + } + } authorizationValidate(permission); return super.isPermitted(principals, permission); } [/pre]
回帖
  • 2019-06-18 10:50:16
    这个踢人的逻辑是不是有点问题啊?我顶替一个用户的时候,会把在线的所有人全部踢掉
    0 回复
  • 2019-07-24 16:03:30
    这个确定有问题了,会造成用户频繁掉线,我是调用的API
    0 回复
  • 2019-09-03 08:59:20
    @[undefined] 你这边解决好了吗?
    0 回复