如何用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. 添加依赖
<!-- 添加AOP依赖 -->
 <dependency>
   <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
  </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() {
    // 管理员特有逻辑
}
  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
自定义注解可以用于实现AOP,以下是一个简单的示例代码,展示了如何使用自定义注解实现AOP。 首先,定义一个自定义注解 `@Authorization`: ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Authorization { String[] roles() default {}; } ``` 然后,在需要进行的方法上添加 `@Authorization` 注解,并指定允许访问的角色列表: ```java public class MyService { @Authorization(roles = {"admin", "superuser"}) public void performAuthorizedAction() { // 执行需要的操作 } public void performUnauthenticatedAction() { // 执行无需的操作 } } ``` 接下来,创建一个切面类 `AuthorizationAspect`,在该类中使用 `@Around` 注解来拦截被 `@Authorization` 注解修饰的方法,并进行验证: ```java import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Component @Aspect public class AuthorizationAspect { @Around("@annotation(authorization)") public Object authorize(ProceedingJoinPoint joinPoint, Authorization authorization) throws Throwable { // 模拟逻辑 if (isUserAuthorized(authorization.roles())) { return joinPoint.proceed(); // 继续执行被拦截方法 } else { throw new UnauthorizedAccessException("Access denied"); // 抛出异常或执行其他处理 } } private boolean isUserAuthorized(String[] roles) { // 实际的逻辑,比如根据用户角色判断是否限访问 // 返回 true 表示有限,返回 false 表示无限 return true; } } ``` 最后,使用 Spring 或其他 AOP 框架来启用该切面,确保切面类被正确加载和生效。 通过以上步骤,你可以实现自定义注解用于AOP,对指定的方法进行限验证。当调用被 `@Authorization` 注解修饰的方法时,会触发切面逻辑,在切面中进行验证,根据验证结果决定是否允许继续执行方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值