文章目录
- 一、引入依赖
- [二、 权限校验注解](#二、 权限校验注解)
- 三、权限校验切面
- 四、使用注解
- 五、防踩坑(注解成员变量的类型)
-
-
- [✅ 允许的注解成员(选项)类型](#✅ 允许的注解成员(选项)类型)
-
一、引入依赖
xml
<!--aop依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
二、 权限校验注解
- 写在
annotation包下
java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthCheck {
/**
* 必须有某个角色
*/
String mustRole() default "";
}
三、权限校验切面
aop包下
java
@Aspect
@Component
public class AuthInterceptor {
@Resource
private UserService userService;
/**
* 执行拦截
*
* @param joinPoint 切入点
* @param authCheck 权限校验注解
*/
@Around("@annotation(authCheck)")
public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable {
String mustRole = authCheck.mustRole();
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
// 当前登录用户
User loginUser = userService.getLoginUser(request);
UserRoleEnum mustRoleEnum = UserRoleEnum.getEnumByValue(mustRole);
// 不需要权限,放行
if (mustRoleEnum == null) {
return joinPoint.proceed();
}
// 以下为:必须有该权限才通过
// 获取当前用户具有的权限
UserRoleEnum userRoleEnum = UserRoleEnum.getEnumByValue(loginUser.getUserRole());
// 没有权限,拒绝
if (userRoleEnum == null) {
throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
}
// 要求必须有管理员权限,但用户没有管理员权限,拒绝
if (UserRoleEnum.ADMIN.equals(mustRoleEnum) && !UserRoleEnum.ADMIN.equals(userRoleEnum)) {
throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
}
// 通过权限校验,放行
return joinPoint.proceed();
}
}
四、使用注解
java
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
五、防踩坑(注解成员变量的类型)
✅ 允许的注解成员(选项)类型
除了下面这些类型,其余类型会报错
- 基本数据类型(primitive types)
byte,short,int,longfloat,doublecharboolean
- 字符串类型
String
- 枚举类型(enum)
- 例如:
TimeUnit.SECONDS
- 例如:
- 注解类型(嵌套注解)
- 即另一个
@interface类型
- 即另一个
- 以上类型的数组形式
- 如:
int[],String[],MyEnum[],MyAnnotation[]
- 如: