85 lines
2.7 KiB
Java
85 lines
2.7 KiB
Java
|
||
|
||
package io.modules.security.oauth2;
|
||
|
||
import io.modules.security.service.ShiroService;
|
||
import io.common.exception.ErrorCode;
|
||
import io.common.utils.ConvertUtils;
|
||
import io.modules.security.entity.SysUserTokenEntity;
|
||
import io.modules.security.user.UserDetail;
|
||
import io.modules.sys.entity.SysUserEntity;
|
||
import lombok.AllArgsConstructor;
|
||
import org.apache.shiro.authc.*;
|
||
import org.apache.shiro.authz.AuthorizationInfo;
|
||
import org.apache.shiro.authz.SimpleAuthorizationInfo;
|
||
import org.apache.shiro.realm.AuthorizingRealm;
|
||
import org.apache.shiro.subject.PrincipalCollection;
|
||
import org.springframework.stereotype.Component;
|
||
import java.util.List;
|
||
import java.util.Set;
|
||
|
||
/**
|
||
* 认证
|
||
*
|
||
|
||
*/
|
||
@Component
|
||
@AllArgsConstructor
|
||
public class Oauth2Realm extends AuthorizingRealm {
|
||
private final ShiroService shiroService;
|
||
|
||
@Override
|
||
public boolean supports(AuthenticationToken token) {
|
||
return token instanceof Oauth2Token;
|
||
}
|
||
|
||
/**
|
||
* 授权(验证权限时调用)
|
||
*/
|
||
@Override
|
||
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
|
||
UserDetail user = (UserDetail) principals.getPrimaryPrincipal();
|
||
|
||
//用户权限列表
|
||
Set<String> permsSet = shiroService.getUserPermissions(user);
|
||
|
||
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
|
||
info.setStringPermissions(permsSet);
|
||
return info;
|
||
}
|
||
|
||
/**
|
||
* 认证(登录时调用)
|
||
*/
|
||
@Override
|
||
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
|
||
String accessToken = (String) token.getPrincipal();
|
||
|
||
//根据accessToken,查询用户信息
|
||
SysUserTokenEntity tokenEntity = shiroService.getByToken(accessToken);
|
||
//token失效
|
||
if (tokenEntity == null || tokenEntity.getExpireDate().getTime() < System.currentTimeMillis()) {
|
||
throw new IncorrectCredentialsException("登录失效,请重新登录!");
|
||
}
|
||
|
||
//查询用户信息
|
||
SysUserEntity userEntity = shiroService.getUser(tokenEntity.getUserId());
|
||
|
||
//转换成UserDetail对象
|
||
UserDetail userDetail = ConvertUtils.sourceToTarget(userEntity, UserDetail.class);
|
||
|
||
//获取用户对应的部门数据权限
|
||
List<Long> deptIdList = shiroService.getDataScopeList(userDetail.getId());
|
||
userDetail.setDeptIdList(deptIdList);
|
||
|
||
//账号锁定
|
||
if (userDetail.getStatus() == 0) {
|
||
throw new LockedAccountException("账号已被锁定!");
|
||
}
|
||
|
||
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userDetail, accessToken, getName());
|
||
return info;
|
||
}
|
||
|
||
}
|