注解类
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface AuthCheckRole {
/**
* 需要校验的角色标识 [ 数组 ]
*
* @return /
*/
String[] value() default {};
/**
* 验证模式:AND | OR,默认AND
*
* @return /
*/
ValidationMode mode() default ValidationMode.AND;
}
切面类
@Slf4j
@Aspect
public class AuthRoleAspect {
/**
* 执行拦截
*
* @param joinPoint
* @param authCheckRole
* @return
*/
@Around("@annotation(authCheckRole)")
public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheckRole authCheckRole) throws Throwable {
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
String token = request.getHeader(RequestHeaderName.TOKEN);
RedisService redisService = SpringUtil.getBean(RedisService.class);
// 获取当前用户的信息
LoginToken loginToken = redisService.getCacheObject(TokenConstants.REDIS_KEY_PREFIX + token);
//回调的时候会是NULL
if (loginToken == null) {
throw new ServiceException("未登录");
}
//管理员看全部
// if (loginToken.getSuperManager() == 1) {
// // 通过权限校验,放行
// return joinPoint.proceed();
// }
//临时
HashSet<String> strings = new HashSet<>();
strings.add(RoleConstants.TENANT_ADMIN_ROLE_KEY);
loginToken.setRoleList(strings);
Set<String> roleList = loginToken.getRoleList();
if (CollUtil.isEmpty(roleList)) {
throw new ServiceException("角色权限不存在");
}
String[] roleArray = authCheckRole.value();
if (authCheckRole.mode() == ValidationMode.AND) {
this.checkRoleAnd(roleArray, roleList);
} else {
this.checkRoleOr(roleArray, roleList);
}
// 通过权限校验,放行
return joinPoint.proceed();
}
/**
* 校验:当前账号是否含有指定角色标识 [ 指定多个,必须全部验证通过 ]
*
* @param roleArray 角色标识数组
*/
public void checkRoleAnd(String[] roleArray, Set<String> roleList) {
// 如果没有指定要校验的角色,那么直接跳过
if (roleArray == null || roleArray.length == 0) {
return;
}
// 开始校验
for (String role : roleArray) {
if (!roleList.contains(role)) {
throw new ServiceException("角色权限不足,请联系管理员");
}
}
}
/**
* 校验:当前账号是否含有指定角色标识 [ 指定多个,只要其一验证通过即可 ]
*
* @param roleArray 角色标识数组
*/
public void checkRoleOr(String[] roleArray, Set<String> roleList) {
// 如果没有指定权限,那么直接跳过
if (roleArray == null || roleArray.length == 0) {
return;
}
// 开始校验
for (String role : roleArray) {
if (roleList.contains(role)) {
// 有的话提前退出
return;
}
}
// 代码至此,说明一个都没通过,需要抛出无角色异常
throw new ServiceException("角色异常");
}
}
配置类
@Configuration
public class AuthRoleConfig {
@Bean
public AuthRoleAspect authRoleAspect() {
return new AuthRoleAspect();
}
}
固定角色配置
public interface RoleConstants {
/**
* 超级管理员ID
*/
String SUPER_ADMIN_ID = "1";
/**
* 超级管理员角色 roleKey
*/
String SUPER_ADMIN_ROLE_KEY = "superadmin";
/**
* 租户管理员角色 roleKey
*/
String TENANT_ADMIN_ROLE_KEY = "admin";
/**
* 租户管理员角色名称
*/
String TENANT_ADMIN_ROLE_NAME = "管理员";
}
枚举
public enum ValidationMode {
/**
* 必须具有所有的元素
*/
AND,
/**
* 只需具有其中一个元素
*/
OR
}
注解的使用
@AuthCheckRole(value = {
RoleConstants.SUPER_ADMIN_ROLE_KEY,
RoleConstants.TENANT_ADMIN_ROLE_KEY
}, mode = ValidationMode.OR)