AOP通过annotation实现并获取annotation的内容

需求描述

业务系统的后台管理对应两种类型的admin角色: SUPERADMIN, ADMIN;对于一些操作只有SUPERADMIN才有权限,比如添加新的ADMIN。
为了灵活方便,定义了一个注解,如果某些接口需要某些role才能操作,就加上相应的注解。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AdminRoleCheck {
    AdminRole requiredRole() default AdminRole.ADMIN;
}

api代码

    @AdminRoleCheck(requiredRole = AdminRole.SUPERADMIN)
    @PostMapping("/private/admin/add")
    public Response<Void> addAdmin(@RequestParam String username,
                                 @RequestParam String password,
                                 @RequestParam(required = false, defaultValue = "ADMIN") AdminRole role) {
        return Response.simpleExecute(() -> adminService.addAdmin(username, password, role));
    }

AOP实现的两种方式

从上面代码中可以看到,注解AdminRoleCheck需要一个参数,在校验逻辑中我们需要考虑取出注解中的requiredRole的值,和当前登陆用户的角色进行对比,如果相等,就放行,否则就终止。

1 通过@Before注解

@Aspect
@Component
@Slf4j
public class AuthAop {

    @Autowired
    AdminHelper adminHelper;

    @Before(value = "@annotation(check)", argNames = "check")
    public void doAdminRoleCheck(AdminRoleCheck check) {
        Admin admin = adminHelper.currentAdmin();
        if (Objects.isNull(admin) || admin.getRole() != check.requiredRole()) {
            throw new BusinessException("Permission denied for this action", ResponseCode.PERMISSION_DENIED);
        }
    }
}

2 通过PointCut

@Aspect
@Component
@Slf4j
public class AuthAop {

    @Autowired
    AdminHelper adminHelper;


    @Pointcut("@annotation(com.binance.bcf.annotations.AdminRoleCheck)")
    public void adminRoleCheck() {
    }

    @Around(value = "adminRoleCheck()")
    public void doAdminRoleCheck(ProceedingJoinPoint joinPoint) throws Throwable {
        AdminRoleCheck annotation = ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(AdminRoleCheck.class);
        Admin admin = adminHelper.currentAdmin();
        if (Objects.isNull(admin) || admin.getRole() != annotation.role()) {
            throw new BusinessException("Permission denied for this action", ResponseCode.PERMISSION_DENIED);
        }
        joinPoint.proceed();
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值