基于 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[]
相关推荐
优秀的颜2 小时前
Maven详细配置(完整笔记)
后端
优秀的颜2 小时前
Nginx分布式框架
后端
勿忘初心7202 小时前
Ubuntu 24.04 PostgreSQL + PostGIS 完整安装与配置指南
后端
czlczl200209252 小时前
Quartz基本原理与工程实践
java·spring boot·后端
白衣鸽子2 小时前
Java Stream:Collectors.collectingAndThen() 用法详解
后端
callJJ2 小时前
Builder模式详解:从困惑到理解
java·建造者模式·智谱
大猫和小黄2 小时前
若依从零到部署:前后端分离和微服务版
java·微服务·云原生·架构·前后端分离·若依
Geoking.2 小时前
【设计模式】享元模式(Flyweight)详解:用共享对象对抗内存爆炸
java·设计模式·享元模式
摸鱼的春哥2 小时前
企业自建低代码平台正在扼杀AI编程的生长
前端·javascript·后端