关键代码如下:
//判断是否同一个用户再同一个浏览器中登录,是就不踢除
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
//获取基于用户名和密码的令牌
//实际上这个authcToken是从LoginController里面currentUser.login(token)传过来的
//两个token的引用都是一样的,本例中是org.apache.shiro.authc.UsernamePasswordToken@33799a1e
/*UsernamePasswordToken token = (UsernamePasswordToken)authcToken;*/
String username = (String)authcToken.getPrincipal();
BaseUser user = webUserService.webLogin(username);
//apache shiro获取所有在线用户
Collection<Session> sessions = sessionDAO.getActiveSessions();
for(Session session:sessions){
String loginUsername = String.valueOf(session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY));
//判断是否同一个用户再同一个浏览器中登录,是就不踢除
if (SecurityUtils.getSubject().getSession().getId().equals(session.getId()))
break;
//获得session中已经登录用户的名字
if(username.equalsIgnoreCase(loginUsername) ){ //这里的username也就是当前登录的username
sessionDAO.delete(session); //这里就把session清除
break;
}
}
//返回值实例化
//身份证认证授权转移到 com.fh.controller.system.login LoginController类下的login()方法中
if( user !=null){
//设置用户session
Session session = SecurityUtils.getSubject().getSession();
session.setAttribute(USER_SESSION, user);
return new SimpleAuthenticationInfo(user.getUserCode(), user.getUserPassword(), getName());
}else{
return null;
}
}