use of com.pace2car.springbootdemo.shiro.entity.UUser in project springbootquickstart by Pace2Car.
the class ShiroRealm method doGetAuthenticationInfo.
/**
* 认证
*
* @param token
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
logger.info("用户登录,登录信息-->{}", token);
// 获取用户的输入的账号.
String username = (String) token.getPrincipal();
// 通过username从数据库中查找 User对象,如果找到,没找到.
// 实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法
UUser user = uUserService.getOne(new QueryWrapper<UUser>().eq("username", username));
logger.info("用户登录,登录信息-->{}", user);
if (user == null) {
// 没有返回登录用户名对应的SimpleAuthenticationInfo对象时,就会在LoginController中抛出UnknownAccountException异常
return null;
} else {
user.setLastLoginTime(new Timestamp(System.currentTimeMillis()));
uUserService.updateById(user);
}
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username, user.getPassword(), getName());
return authenticationInfo;
}
use of com.pace2car.springbootdemo.shiro.entity.UUser in project springbootquickstart by Pace2Car.
the class KickoutSessionControlFilter method onAccessDenied.
/**
* 表示访问拒绝时是否自己处理,
* 如果返回true表示自己不处理且继续拦截器链执行,
* 返回false表示自己已经处理了(比如重定向到另一个页面)。
*/
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
Subject subject = SecurityUtils.getSubject();
if (!subject.isAuthenticated() && !subject.isRemembered()) {
// 如果没有登录,直接进行后面的流程
return true;
}
Session session = subject.getSession();
// 这里获取的User是实体 因为我在 自定义ShiroRealm中的doGetAuthenticationInfo方法中
// new SimpleAuthenticationInfo(user, password, getName()); 传的是 User实体 所以这里拿到的也是实体,如果传的是userName 这里拿到的就是userName
Object principal = subject.getPrincipal();
String username = ((UUser) principal).getUsername();
Serializable sessionId = session.getId();
// 初始化用户的队列放到缓存里
Cache.ValueWrapper valueWrapper = cache.get(username);
Deque<Serializable> deque = null;
if (valueWrapper != null) {
deque = (Deque<Serializable>) valueWrapper.get();
}
if (deque == null) {
deque = new LinkedList<>();
cache.put(username, deque);
}
// 如果队列里没有此sessionId,且用户没有被踢出;放入队列
if (!deque.contains(sessionId) && session.getAttribute("kickout") == null) {
deque.push(sessionId);
}
// 如果队列里的sessionId数超出最大会话数,开始踢人
while (deque.size() > maxSession) {
Serializable kickoutSessionId = null;
// 如果踢出后者
if (kickoutAfter) {
kickoutSessionId = deque.getFirst();
kickoutSessionId = deque.removeFirst();
} else {
// 否则踢出前者
kickoutSessionId = deque.removeLast();
}
try {
Session kickoutSession = sessionManager.getSession(new DefaultSessionKey(kickoutSessionId));
if (kickoutSession != null) {
// 设置会话的kickout属性表示踢出了
kickoutSession.setAttribute("kickout", true);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 如果被踢出了,直接退出,重定向到踢出后的地址
if (session.getAttribute("kickout") != null) {
// 会话被踢出了
try {
subject.logout();
} catch (Exception e) {
e.printStackTrace();
}
WebUtils.issueRedirect(request, response, kickoutUrl);
return false;
}
return true;
}
Aggregations