Files
common-base/src/main/java/com/common/base/shiro/CustomRealm.java
2020-07-29 13:44:28 +08:00

81 lines
3.1 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.common.base.shiro;
import com.common.base.shiro.service.ShiroService;
import com.common.base.shiro.service.SystemRealm;
import com.common.base.utils.RedisUtil;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import javax.annotation.Resource;
import java.util.Date;
import java.util.Map;
public class CustomRealm extends AuthorizingRealm {
@Resource
private ShiroService shiroService;
@Resource
private RedisUtil redisUtil;
@Resource
private SystemRealm systemRealm;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//1. 从 PrincipalCollection 中来获取登录用户的信息
Object user = principalCollection.getPrimaryPrincipal();
return systemRealm.setAuthoriztion(user);
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) {
String accessToken = (String) token.getPrincipal();
String userId;
if (RedisUtil.isUseful) {
Map<Object,Object> hashMap = redisUtil.hmget(accessToken);
userId = (String) hashMap.get("userId");
if (userId == null) {
throw new IncorrectCredentialsException("token失效请重新登录");
}
String tokenStr = (String) redisUtil.hget("session", String.valueOf(userId));
if (tokenStr==null||!tokenStr.equals(accessToken)) {
redisUtil.del(accessToken);
throw new IncorrectCredentialsException("token失效请重新登录");
}
Date expireTime = (Date) hashMap.get("expireTime");
System.out.println(expireTime);
if (expireTime.getTime() < System.currentTimeMillis()) {
redisUtil.del(accessToken);
throw new IncorrectCredentialsException("token失效请重新登录");
}
} else {
//1. 根据accessToken查询用户信息
FtToken tokenEntity = shiroService.findByToken(accessToken);
userId = tokenEntity.getUserId();
//2. token失效
if (tokenEntity.getExpireTime().getTime() < System.currentTimeMillis()) {
throw new IncorrectCredentialsException("token失效请重新登录");
}
}
//3. 调用数据库的方法, 从数据库中查询 username 对应的用户记录
Object user = shiroService.findByUserId(userId);
//4. 若用户不存在, 则可以抛出 UnknownAccountException 异常
if (user == null) {
throw new UnknownAccountException("用户不存在!");
}
//5. 根据用户的情况, 来构建 AuthenticationInfo 对象并返回. 通常使用的实现类为: SimpleAuthenticationInfo
return new SimpleAuthenticationInfo(user, accessToken, this.getName());
}
@Override
public boolean supports(AuthenticationToken authenticationToken) {
return authenticationToken instanceof AuthToken;
}
}