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
}
使用
在方法上加上注解