AOP+自定义注解 实现角色的访问控制(RBAC)

AOP除了可以通过切入点表达式指定需要切入的方法,还有与注解相关的写法

通过在方法上注自定义注解,注解带不同的权限码;方法被调用前,AOP拦截查看是否有此权限,有则放行

自定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Code {
    
    
    String value() default "";
}

AOP

@Component
@Aspect
public class PermissionHandler {
    
    
    
    @Autowired
    HttpSession session;

    /**
     * 权限控制,权限码之前已经存在session中
     */
 @Around("@annotation(com.annotation.Code)")
    public void permissionHandler(ProceedingJoinPoint joinPoint) throws Throwable {
    
    
        List<String> permissions = (List<String>) session.getAttribute("permissions");
        System.out.println("permissions:"+permissions);
        if (permissions == null || permissions.size() == 0) {
    
    
            // 没有权限时,抛出自定义异常
            throw new MyException();
        } else {
    
    
            // 获取方法上的注解对象
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            Code code = signature.getMethod().getDeclaredAnnotation(Code.class);
            // 如果不存在该授权码,则不执行该方法,并抛出异常
            if (!permissions.contains(code.value())) {
    
    
                throw new MyException();
            }
        }
        joinPoint.proceed();
    }
}

需要控制访问的方法

    @Code("1001")
    @PostMapping("/addRole")
    @ResponseBody
    public ResultInfo addRole(Role role) {
    
    
        roleService.addRole(role);
        resultInfo.setAll(200, "新增角色成功", null);
        return resultInfo;
    }

猜你喜欢

转载自blog.csdn.net/weixin_51681634/article/details/112998634