场景需求:节点配置功能中,需要实现不同人员对不同节点的细粒度权限控制。
方案:通过注解+Spring AOP实现。自定义一个权限注解,该注解标注在控制器方法上,切面类对所有标注该注解的方法执行鉴权逻辑。
前言:计划设定角色概念,不同角色有增删改查中不同的权限组合,例如普通管理员拥有增和查的权限,除了角色这种固定的权限控制外,希望某个人对单个节点的细粒度权限控制,例如希望小王对A节点拥有增删改查所有权限,但对其余节点的权限遵循普通管理员的权限(即增和查的权限)。
一、自定义权限注解
/**
* description: 自定义权限注解,用于AOP <br>
* 权限判断需要被注解的方法名称与数据库配置的权限名称相同,如数据库中配置的更新、删除、新增、获取的权限名称分别为update、delete、add、get,
* 则被注解的方法名称需要以以上四个权限名称之一命名,否则当前方法和权限匹配不上,统一视为无权限
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Permission {
}
二、接口鉴权切面
运用Spring AOP,对标注注解的方法进行拦截,在前置通知中进行接口参数的解析,并调用鉴权服务类进行权限鉴定
/**
* description: 接口鉴权切面 <br>
*/
@Aspect
@Component
@Slf4j
public class PermissionAspect {
@Autowired
private PermissionCheckService permissionCheckService;
@Pointcut("@annotation(com.test.logicflow.annotation.Permission)")
public void permissionAnno(){
}
@Before("permissionAnno()")
public void PermissionCheck(JoinPoint joinPoint) throws LogicException {
log.info("=======开始权限校验=======");
Signature signature = joinPoint.getSignature();
String methodName = signature.getName();