同一个账号,只允许一个人登录
sui
VIP3
2018-08-30 17:55:09
最后修改:2018-08-31 00:06:18
收藏
## 配置方式
#是否允许多账号同时登录
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]