使用AOP实现权限拦截校验

  aop的好处就在于它可以只让你写一次代码,然后这些代码就可以用于容器当中的所有对象,权限拦截校验是一个表现形式。

  那么,我们要如何实现这个功能?

  首先,定义一个注解:

  

 

  这里有一个PermissionEnum枚举类,当然可以直接使用String 代替,不过不推荐,其源码如下:

  

 

  这里,我们控制的权限颗粒度是方法,所以必须使用一个标识符来标志出每个方法,我们只要将Permission注解加到方法之上,就能被切面所拦截,并进行权限校验:

  

 

  

  上面是一个方法示例:

  接下来就是重点了,切入点的编写:

  @Before(pointCut())

  public void before(JoinPoint joinPoint){

  Signature signature = joinPoint.getSignature();

  MethodSignature methodSignature = (MethodSignature) signature;

  Method method = methodSignature.getMethod();

  var a = method.getAnnotation(Permission.class);

  String msg = null;

  if (.equals(a.msg())){

  msg = 没有+a.value().getPermission()+权限;

  }else{

  msg = a.msg();

  }

  var permission = adminPermissionService.getCurrentAdminPermission();

  try {

  String methodName = a.value().getPermission();

  methodName = methodName.substring(0,1).toUpperCase()+methodName.substring(1,methodName.length());

  Method method1 = permission.getClass().getMethod(get+methodName);

  Boolean ret = (Boolean) method1.invoke(permission);

  if (ret == null){

  ErrorUtils.error(msg);

  }

  if (!ret){

  ErrorUtils.error(msg);

  }

  } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {

  throw new RuntimeException(e.getMessage());

  }

  }

  代码虽然有点长,但做的事并不多,无非就是获取当前登录管理员的权限,然后判断该其切点的权限要求当前管理是否满足,满足就继续运行,否则抛出一个权限错误的异常。

  当然,这个权限拦截校验方案是写死的,也就是说你无法根据实际的情况需要添加或者删除的相应权限,因为这是由系统的权限控制方案所限定的,我们权限拦截的目标是方法,不像其他诸如URL的拦截方案,想要修改方法,即拦截目标,就必须修改源码,所以也就没有必要做成高度可自定义化的权限方案。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值