今天想分享的是一个自定义的注解,@RequiresMethodPermissions,为什么想到要自定义这个注解?因为Shiro为我们提供的关于权限的注解@RequiresPermissions需要一个Permission的参数。
实践中,需要我们事先对所有权限字串(假如使用通配符Permission)做出一个规划,然后所有Coder在编码过程中严格按这个权限表来coding。
于是,我们可以偷懒一下,将权限字串规划这样定义,就使用完整的类名加方法名,即: [ClassName]:[MethodName],那么我们的注解就变成了这样的模样:
@RequiresPermissions("cn.sharetop.example.HelloController:addUser")
那么,问题来了,能不能更简化一下,并且增加一点可读性,比如这样呢:
@RequiresPermissions("新增用户")
所以,我们需要自定义这个注解了,且叫做 @RequiresMethodPermissions 吧。
第一步,定义注解。这里的value是作为权限的中文描述,并非用来判断的权限字串,真正用来判断的字串其实是被注解的方法及所在的类名:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresMethodPermissions {
String value() default "";
}
第二步,重载Shiro的Advisor。
/**
* 实现全套Permission的注解处理
*
* @author yancheng
*
* 逻辑:
*
* 从advisor 将当前注解的class/method,拼出className:methodName,作为权限字串
* 将自已advisor作为引用传给authzMethodInterceptor
* 再透传给MethodPermission的MethodInterceptor
* 再透传到MethodPermission的AnnotationHandler
*