springboot 项目动态开启权限(模仿@EnableXXXX)

1 创建一个EnableXXX 注解类
import com.cpiinfo.iot.isolar.config.PermissionsSelector;
import org.springframework.context.annotation.Import;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @description: 系统权限开启注解
 * @author: fan
 * @date: 2022/4/18 9:35
 * @version: 1.0
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Import({PermissionsSelector.class})
public @interface EnablePermissions {

}
2 权限注解类
import com.cpiinfo.iot.isolar.Logical;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @description: 权限注解类
 * @author: fan
 * @date: 2022/4/18 10:05
 * @version: 1.0
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface RequiresPermissions {

    /**
     * 需要校验的权限码
     */
    String[] value() default {};

    /**
     * 验证模式:AND | OR,默认AND
     */
    Logical logical() default Logical.AND;
}
3 ImportSelector 把某个类交给spring

这里就是 PreAuthorizeAspect 类

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @description: ImportSelector 把某个类交给spring
 * @author: fan
 * @date: 2022/4/18 9:42
 * @version: 1.0
 */
public class PermissionsSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{PreAuthorizeAspect.class.getName()};
    }
}
4 创建切点类
import com.cpiinfo.iot.isolar.annontion.RequiresPermissions;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;

import java.lang.reflect.Method;

/**
 * @description: 切点类
 * @author: fan
 * @date: 2022/4/18 9:43
 * @version: 1.0
 */
@Aspect
public class PreAuthorizeAspect {

    /**
     * 声明AOP签名
     * 这里只是定义了一个切点 可以匹配对应的注解方法
     */
    @Pointcut("@annotation(com.cpiinfo.iot.isolar.annontion.RequiresPermissions)")
    public void pointcut(){
    }

    @Before("pointcut()")
    public void doAccessCheck(JoinPoint joinPoint) {
        // 注解鉴权
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        checkMethodAnnotation(signature.getMethod());
    }

    /**
     * 对一个Method对象进行注解检查
     */
    public void checkMethodAnnotation(Method method)
    {


        // 校验 @RequiresPermissions 注解
        RequiresPermissions requiresPermissions = method.getAnnotation(RequiresPermissions.class);
        if (requiresPermissions != null)
        {

            System.out.println("110---------");
            // TODO 这里就是权限逻辑
            //AuthUtil.checkPermi(requiresPermissions);
        }
    }

}

补充

枚举类

/**
 * @description: 权限注解的验证模式
 * @author: fan
 * @date: 2022/4/18 9:40
 * @version: 1.0
 */
public enum Logical
{
    /**
     * 必须具有所有的元素
     */
    AND,

    /**
     * 只需具有其中一个元素
     */
    OR
}
使用

在方法上加上注解

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值