首页 > 其他分享 >分享!! 如何自定义权限校验的注解并用AOP拦截实现权限校验

分享!! 如何自定义权限校验的注解并用AOP拦截实现权限校验

时间:2024-08-18 11:04:48浏览次数:13  
标签:自定义 校验 用户 管理员 UserRoleEnum 注解 权限

Customize permission verification annotation and implement it with AOP

详细步骤

创建自定义注解

image-20240818095410427

自定义如下

image-20240818095509184

解释一下:

@Target(ElementType.METHOD) // 指定为method上使用的注解
@Retention(RetentionPolicy.RUNTIME) // 在运行时保留
String mustRole() default "" // 注解需要提供一个String类型的参数,不提供的话默认是空字符串

接下来使用AOP来拦截写了这个注解的全部方法

先创建拦截器

image-20240818095936997

具体代码如下
代码已经逐行写了注释进行解释了,所以直接看注释就行了

@Aspect
@Component
public class AuthInterceptor {
    
    @Resource
    private UserService userService;   // 后续会使用到,所以注入一下UserService
   
    @Around("@annotation(authCheck)")  // 定义一个环绕通知,根据参数AuthCheck authCheck推断出需要拦截所有带有AuthCheck注解的方法
    public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable {
        String mustRole = authCheck.mustRole(); //拿到被拦截的方法上面的注解中传入的参数

        //  获取与当前线程关联的RequestAttributes对象
        RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();



        HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();  // 转化为HttpServletRequest,拿到当前请求对象
        // 拿到当前登录用户
        User loginUser = userService.getLoginUser(request);
        // 查询一下这个被拦截的注解里面传进来的参数是不是下面我们自己定义的三种之一
        //USER("用户", "user"),
   	    //ADMIN("管理员", "admin"),
        // BAN("被封号", "ban");
        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.BAN.equals(userRoleEnum)) {
            throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
        }
        // 下面就是 当前登录有权限,而且不是被封号这种
        if (UserRoleEnum.ADMIN.equals(mustRoleEnum)) {
            //  假设定义了管理员权限,来判断一下用户是不是管理院权限
            if (!UserRoleEnum.ADMIN.equals(userRoleEnum)) {
                // 如果用户不是管理员权限,抛异常
                throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
            }
        }
        
        // 到这里说明   通过权限校验了
        // 1. 需要管理员权限,当前登录用户就是
        // 2. 不需要管理员权限,当前用户是用户权限或者是管理员权限 
        return joinPoint.proceed();
    }
}

标签:自定义,校验,用户,管理员,UserRoleEnum,注解,权限
From: https://www.cnblogs.com/nicebaoke/p/18365399

相关文章

  • Upload-Lab第10关:点空点绕过绕过文件上传校验
    简介在upload-lab的第10关,我们面对的是一个常见的文件上传防护机制:黑名单验证。黑名单验证是指系统通过拒绝特定扩展名或内容类型的文件来防止恶意文件上传。然而,这种防护机制通常存在漏洞,可以被绕过。下面是第10关的源码:$is_upload=false;$msg=null;if(isset($_......
  • nginx配置下载服务器(具备权限验证)
    大多数场景中,下载可以使用nginx直接代理,但缺少权限验证,下述方式下载通过后端校验,成功后转发请求nginx进行下载操作。前端代码:window.location.href="http://192.168.80.128:8080/download_file?fileName=8042200341080001_01.zip";直接打开访问指定的下载文件路径(我是用请......
  • asp.net 禁止主机交互式 shell 命令执行权限风险 ashx
    以下为ai回复:在ASP.NET应用程序中,如果要防止通过ashx文件执行宿主环境的shell命令以避免潜在的权限提升风险,可以通过设置web.config来限制或禁用此功能。在web.config中,可以通过设置<securityPolicy>来禁止执行shell命令。以下是一个示例配置,它禁用了所有的shell执行权限:<syst......
  • DzzOffice修改权限判断方式解决另存为窗口新建文件无权限问题
    在执行另存为操作并选择文件与位置时,如提示无权限问题,此现象源于权限判断方式存在差异。为解决此问题,以在另存为窗口新建文件时提示无权限问题为例进行阐述。打开\dzz\system\fileselection\ajax.php文件。找到elseif($operation=='newIco'){//新建文件将perm_ch......
  • Java中使用lambda表达式自定义排序
    对于一维数组,通常使用Arrays.sort()(默认升序)int[]nums={3,1,4,2};Arrays.sort(nums);对于二维数组,可以lambda表达式实现特定的排序要求。在Arrays.sort()的第二个参数中,写lambda表达式lambda表达式形如(a,b)->{returna-b;},其中a,b表示数组中的元素升序/......
  • Android开发 - 使用自定义接口在新窗口中传回数据
    在Android开发中,有时候我们需要在新打开的窗口中传递数据回来。例如:在新打开的DialogFragment窗口传递数据回MainActivity启动窗口代码举例首先在MainActivity中定义实例化一个DialogFragment窗口//MainActivity.java//点击按钮打开一个DialogFragment窗口......
  • 什么是AOP,以及在Springboot中自定义AOP
    AOP(AspectOrientedProgramming)一般译为面向切面编程Aspect[ˈæspekt]n.方面;层面;(动词的)体那么AOP面相切面编程具体是指什么,它和之前的OOP面相对象编程又有什么区别和联系。先说OOP,面相对象编程简单来说,万物皆可视为对象,我们要做的就是将万物(业务逻辑中的虚拟物体),抽象为......
  • 文件权限管理
    一、用户、用户组、其他人1、用户在Linux中,用户(User)是系统中能够登录并执行任务的实体。每个用户都有一个唯一的用户ID(UID)和用户名。用户在系统中的权限由它的UID和分配的组来决定。通常,一个用户就是一个实际的人,但也可能是一个系统服务或进程。2、用户组用户组(Group)是......
  • 【数据库】事务 | 视图 | 自定义函数创建
    1、事物及其特征事物机制的应用:淘宝订单交易,微信转账等。视图--------筛子---------过滤-------筛选想要的信息数据库只存放了视图对应的SQL语句。视图是一个虚拟的表,本质是一个虚拟的SQL命令集合。(1)创建单表视图(虽然视图里没有30的数据,但原表里插入这个30的数据......
  • h5直播源码,用户登录流程及权限校验
    h5直播源码,用户登录流程及权限校验今天我们来看一下用户登录的流程前端部分 以一个后台管理系统登录为例:登录篇1.用户输入账号和密码点击登录传给服务器用户名和密码2.服务器验证成功后给客户端传递一个token,并且把这个token存在cookies中,这样下次再向服务器发请......