基于 Spring AOP 的角色权限校验实现指南&&注解类型避坑指南

文章目录

一、引入依赖

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)

五、防踩坑(注解成员变量的类型)

✅ 允许的注解成员(选项)类型

除了下面这些类型,其余类型会报错

  1. 基本数据类型(primitive types)
    • byte, short, int, long
    • float, double
    • char
    • boolean
  2. 字符串类型
    • String
  3. 枚举类型(enum)
    • 例如:TimeUnit.SECONDS
  4. 注解类型(嵌套注解)
    • 即另一个 @interface 类型
  5. 以上类型的数组形式
    • 如:int[], String[], MyEnum[], MyAnnotation[]
相关推荐
天天被压力4 分钟前
【跨市场数据实战 #08】可转债折价机会怎么筛:3个接口抓比价、列表和实时盘口
java·人工智能·python
aramae20 分钟前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他
张某布响丸辣1 小时前
附件下载的安全边界:路径白名单、NAS 哨兵文件与 Redis Lua 一次性令牌
java·redis·redis lua·nas哨兵
徐小夕1 小时前
存量.doc 文档怎么办?JitWord 开源转换库打通旧文档到在线协同全链路
后端·架构·github
ee又momo1 小时前
一次 JWT Token 过期续期的踩坑记录
后端
二月龙1 小时前
App 瘦身实战:图片、so 库、资源压缩,安装包体积减小 40%
后端
YatHinLay1 小时前
Spring Boot + Calcite 实现跨库查询
java
大勇前进1 小时前
Kotlin 协程实战避坑:90% 的人都会踩的生命周期泄漏问题
后端
酷炫码神2 小时前
MosMos 创意效果与能力边界展示
java
Wang's Blog2 小时前
Java 接入Redis: 使用Jedis操作Redis
java·服务器·redis