SpringBoot AspectJ切面配合自定义注解实现权限校验的示例详解

 更新时间:2025年09月15日 17:29:11   作者:GFIRE1999  
本文章介绍了如何通过创建自定义的权限校验注解,配合AspectJ切面拦截注解实现权限校验,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

本文章介绍了如何通过创建自定义的权限校验注解,配合AspectJ切面拦截注解实现权限校验。

1. 创建权限校验注解

创建权限校验注解,可用在方法和类上,authPoint属性表示所需的权限点。代码如下:

package com.guo.demo.examples.permissioncheck;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.TYPE, ElementType.METHOD})
public @interface PermissionCheck {
    /**
     * 所需的权限点
     *
     * @return 所需的权限点
     */
    String authPoint();
}

2. 创建AspectJ切面拦截注解校验权限

创建AspectJ切面,拦截带有@PermissionCheck注解的方法或类,获取注解上的权限点进行校验。代码如下:

package com.guo.demo.examples.permissioncheck;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Slf4j
@Aspect
@Component
public class PermissionCheckAspect {
    // 权限校验服务
    @Resource
    private PermissionService permissionService;
    // 定义切入点表达式,匹配带有PermissionCheck注解的方法或类
    @Pointcut("@annotation(com.guo.demo.examples.permissioncheck.PermissionCheck) || @within(com.guo.demo.examples.permissioncheck.PermissionCheck)")
    public void pointCut() {
    }
    @Around("pointCut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        // 1.获取目标类上的目标注解
        PermissionCheck annotationInClass = AnnotationUtils.findAnnotation(signature.getDeclaringType(), PermissionCheck.class);
        // 2.获取目标方法上的目标注解
        PermissionCheck annotationInMethod = AnnotationUtils.findAnnotation(signature.getMethod(), PermissionCheck.class);
        // 优先取方法上的注解,若方法上无注解,则取类上的注解
        PermissionCheck annotation = annotationInMethod != null ? annotationInMethod : annotationInClass;
        if (annotation == null) {
            log.error("PermissionCheck annotation is null, {}", signature.toLongString());
            throw new RuntimeException("PermissionCheck annotation is null");
        }
        String authPoint = annotation.authPoint();
        if (permissionService.hasAuthPoint(authPoint)) { // 进行权限校验
            return joinPoint.proceed();
        } else {
            log.warn("user [{}] no permission, authPoint: {}", SessionUtils.getCurrentUser().getFullName(), authPoint);
            throw new RuntimeException("no permission: [" + authPoint + "]");
        }
    }
}

PermissionService的hasAuthPoint方法用于判断当前用户是否拥有所需权限点。

例如,将用户的拥有的权限点集合存储到Session中,校验时通过Session拿到用户的权限点集合进行判断

3. 用法示例

package com.guo.demo.examples.permissioncheck;
import com.guo.demo.pojo.vo.Response;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.Valid;
@RestController
@RequestMapping("employee")
// 如果在类上使用注解,则对该类下所有public方法生效
// @PermissionCheck(authPoint = AuthPointConstant.EMPLOYEE_MANAGE)
public class EmployeeController {
    @Resource
    private EmployeeService employeeService;
    @PermissionCheck(authPoint = AuthPointConstant.ADD_EMPLOYEE) // 在方法上使用校验注解
    @PostMapping("add")
    public Response<?> add(@RequestBody @Valid AddEmployeeRequest request) {
        employeeService.add(request);
        return Response.success();
    }
}

AuthPointConstant是一个用于存放权限点常量的类,方便统一集中管理权限点。比如:

public class AuthPointConstant {
    public static final String EMPLOYEE_MANAGE = "employee:manage"; // 管理员工
    public static final String ADD_EMPLOYEE = "employee:add"; // 添加员工
}

A. 参考文章

到此这篇关于SpringBoot AspectJ切面配合自定义注解实现权限校验的示例详解的文章就介绍到这了,更多相关SpringBoot AspectJ权限校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 遍历Map的几种方法总结

    java 遍历Map的几种方法总结

    这篇文章主要介绍了java 遍历Map的四种方法,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-10-10
  • Java Stream流从入门到精通(最新整理)

    Java Stream流从入门到精通(最新整理)

    Java Stream 是一个来自 java.util.stream 包的抽象概念,它允许你以声明方式处理数据集合(例如 List、Set 等),本文给大家介绍Java Stream流从入门到精通,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • Java编写的24点纸牌游戏

    Java编写的24点纸牌游戏

    这篇文章主要介绍了Java编写的24点纸牌游戏的相关资料,需要的朋友可以参考下
    2015-03-03
  • 基于Spark实现随机森林代码

    基于Spark实现随机森林代码

    这篇文章主要为大家详细介绍了基于Spark实现随机森林代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • JavaWeb之Servlet注册页面的实现示例

    JavaWeb之Servlet注册页面的实现示例

    注册页面是很多网站都会是使用的到,本文主要介绍了JavaWeb之Servlet注册页面的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Java使用BigDecimal公式精确计算及精度丢失问题

    Java使用BigDecimal公式精确计算及精度丢失问题

    在工作中经常会遇到数值精度问题,比如说使用float或者double的时候,可能会有精度丢失问题,下面这篇文章主要给大家介绍了关于Java使用BigDecimal公式精确计算及精度丢失问题的相关资料,需要的朋友可以参考下
    2023-01-01
  • java获取一个文本文件的编码(格式)信息

    java获取一个文本文件的编码(格式)信息

    这篇文章主要介绍了java获取一个文本文件的编码(格式)信息,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 巧妙的利用Mongodb做地理空间查询

    巧妙的利用Mongodb做地理空间查询

    本篇文章将会以Mongodb为数据库,讲述如何在数据库层级进行定位查询。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • springboot controller 增加指定前缀的两种实现方法

    springboot controller 增加指定前缀的两种实现方法

    这篇文章主要介绍了springboot controller 增加指定前缀的两种实现方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 初始JAVA模块化开发的超详细步骤(适合菜鸟)

    初始JAVA模块化开发的超详细步骤(适合菜鸟)

    这篇文章主要介绍了初始JAVA模块化开发的超详细步骤,详细解释了模块描述符的职责、模块路径的概念以及如何使用命令行运行模块化Java程序,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2025-03-03

最新评论