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 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 deptIdList = shiroService.getDataScopeList(userDetail.getId()); userDetail.setDeptIdList(deptIdList); //账号锁定 if (userDetail.getStatus() == 0) { throw new LockedAccountException("账号已被锁定!"); } SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userDetail, accessToken, getName()); return info; } }