二十七、权限控制的自定义注解实现方式
来源:互联网 发布:汤姆索亚历险记 知乎 编辑:程序博客网 时间:2024/05/01 05:23
目的:将账号的操作权限通过数据库进行配置,程序限制只有当拥有某权限时才能调用相应方法。
首先在注解类里定义权限(包括读、写、审核权限)。
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface AuthAnnotation {public enum AuthLevel{read,write,examine}public AuthLevel value();}
然后是对上面注解类进行解析的类:
@Componentpublic class AnnotationParse { @Autowiredprivate TmallAuthDAO tmallAuthDAO; public void parseMethod(Class clazz,long userId, long operateObj) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException{ Object obj = clazz.getConstructor(new Class[]{}).newInstance(new Object[]{}); for(Method method : clazz.getDeclaredMethods()){ AuthAnnotation authAnnotation = method.getAnnotation(AuthAnnotation.class); if(authAnnotation != null){ TmallAuthDO tmallAuthDO = (TmallAuthDO) tmallAuthDAO.getAuthByUserIdAndOperateObj(userId, operateObj); if(tmallAuthDO != null){ long needCheckedAuth = authAnnotation.value()==AuthLevel.read?1:authAnnotation.value()==AuthLevel.write?2:authAnnotation.value()==AuthLevel.examine?4:null; if((tmallAuthDO.getOperate() & needCheckedAuth) == needCheckedAuth){ method.invoke(obj, authAnnotation.value()); }else{ } } } } } }
注:tmallAuthDO.getOperate()中存储的是userId对operateObj这条数据记录的操作权限,会将权限与注解限制的条件(即下面注解方法的@AuthAnnotation(AuthLevel.read)中的AuthLevel.read)进行按位与,这样一个账号对某条数据可以拥有多个权限,相应权限控制的多个方法才能都执行。
定义好了,下面就是使用了:
public class UserAuthInfo {@AuthAnnotation(AuthLevel.examine)public void check(AuthLevel authLevel){System.out.println("哈哈,可以进行审批工作");}@AuthAnnotation(AuthLevel.read)public void read(AuthLevel authLevel){System.out.println("哈哈,可以进行查阅工作");}@AuthAnnotation(AuthLevel.write)public void write(AuthLevel authLevel){System.out.println("哈哈,可以进行录入、修改工作");}}
客户端调用的方式:
@Componentpublic class AuthInvoker {@Autowiredprivate AnnotationParse annotationParse;public void methoda(long userId, long operateObj) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, InstantiationException{annotationParse.parseMethod(UserAuthInfo.class,userId,operateObj);}}
单元测试的方法:
@Test
@Testpublic void testAuth() throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, InstantiationException{authInvoker.methoda(2030802211, 2);}
数据准备:首先建这样一张表
插入一条数据,让会员id为2030802211,赋予权限operate=5(读1、审核4)。
执行的结果如下:
可以看到,读权限的方法read和审核权限的方法check都被执行了,而有写权限才能执行的方法write并没有被执行,这正是想要的结果。
- 二十七、权限控制的自定义注解实现方式
- 使用Struts2的拦截器和自定义注解方式实现权限控制
- 如何自定义注解实现简单的权限控制
- 细粒度 自定义注解 权限控制具体实现
- 细粒度 自定义注解 权限控制具体实现
- 自定义注解+拦截器实现权限控制
- 自定义注解+拦截器实现权限控制
- SpringBoot 自定义注解实现权限控制
- Spring AOP自定义注解实现权限控制
- springMVC 注解+枚举方式实现权限控制
- 自定义注解,控制权限。
- 利用struts2拦截器加自定义注解实现权限控制
- 自定义注解+Struts2拦截器实现简单权限控制
- spring AOP + 自定义注解实现权限控制小例子
- springAOP与自定义注解实现细粒度权限控制管理
- spring AOP + 自定义注解实现权限控制小例子
- 自定义struts(二)--FakeStruts实现@Transaction 注解事务控制
- 自定义标签实现网站权限的控制
- C# 获取天气 JSON解析
- 列表
- Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析
- 一位禅师临终前的忏悔和忠言
- dedecms 友情链接的详细分析
- 二十七、权限控制的自定义注解实现方式
- iphone ios 屏幕,statusbar,状态栏,标签栏尺寸,高度
- 元组
- 一个奇怪的free的应用
- Qt学习之路MainWindow学习过程中的知识点
- C++中的定时器-SetTimer
- iBatis批处理
- 字典
- 自定义Activity style