如何用aop帮我们实现鉴权注解(判断登录用户是否是管理员) -- 通俗易懂版

AOP是什么?

aop是spring中的一个核心的模块,是一种思想: 把某一个或一些方法抽象出一个切点,然后,统一的给这个切点增强,也就是这个切点上的所有方法都会被增强。

  • 怎样表示一个切面?
    e x e c u t i o n ( ∗ c o m . p a c a g e N a m e . m e t h o d N a m e ( ∗ ) ) execution(* com.pacageName.methodName( *)) execution(com.pacageName.methodName()) 类似这种表达式可以表示多个方法为切面。
  • 怎样表示增强与切点之间的关系?有哪几种增强?
    我们可以在方法被调用之前增强,也可以在之后,或者前后都增强等等。有一个概念叫切面,被增强后的切点就叫切面。
  • spring容器中共有五种通知类型
  1. 前置通知 @Before 在方法执行前执行
  2. 后置通知 @After 在方法执行后执行
  3. 返回通知 @AfterReturning在方法执行前执行,无论是否出现异常
  4. 异常通知 @AfterThrowing在方法执行前执行,出现异常则不执行
  5. 环绕通知 @Around可以单独完成以上四个通知

为什么要用AOP来实现?

  1. 如果有好多个接口都鉴权,那这几个接口里面都要加上鉴权的逻辑。代码比较冗余,而且如果这个鉴权的逻辑要修改的话,所有用到的地方都要同步修改,非常麻烦,不好维护。
  2. 使用切面来把这些接口增强以后,我只需要在用到的地方加上一个注解,功能就实现了,修改起来也方便。

怎样实现?

  1. 添加依赖

 <dependency>
   <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-aopartifactId>
  dependency>
  1. 定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface AdminPermission {
    // 可以添加更多的元信息,如描述等信息
}
  1. 添加开启aop注解配置,创建切面
@EnableAspectJAutoProxy
// 在启动类上或者配置类上加就行
@Aspect
@Component
public class AdminPermissionAspect {
    @Around("@annotation(AdminPermission)")// AdminPermission改成注解的类路径
    public Object checkAdminPermission(ProceedingJoinPoint joinPoint) throws Throwable {
        // 在这里实现检查当前用户是否为管理员的功能
        if (isCurrentUserAdmin()) {
            return joinPoint.proceed();
        } else {
            throw new AccessDeniedException("当前用户不是管理员,无法访问该方法");
        }
    }
    
    private boolean isCurrentUserAdmin() {
        // 实现获取当前用户信息的逻辑,判断是否为管理员
    }
}
  1. 使用
@AdminPermission
public void manageUsers() {
    // 管理员特有逻辑
}

你可能感兴趣的:(开发语言,spring,java)