美文网首页
使用Java注解实现RBAC规则的自动提取

使用Java注解实现RBAC规则的自动提取

作者: Jimshen | 来源:发表于2018-01-08 15:56 被阅读194次

RBAC是各类系统中应用最广泛的访问控制机制。使用RBAC时,一个比较复杂的问题是维护数据库中的规则列表。本文使用Java注解实现了规则的自动提取,程序员只需要在需要权限控制的方法上方用RBAC注解说明规则名,规则url和能使用该方法的角色名即可。

RBAC表结构

一、RBAC注解

package annotation.rbac;  

import java.lang.annotation.ElementType;  

import java.lang.annotation.Retention;  

import java.lang.annotation.RetentionPolicy;  

import java.lang.annotation.Target;  

@Retention(RetentionPolicy.RUNTIME)  

@Target(value = {ElementType.METHOD})  

public @interface Rbac {  

    String url();  

    String[] role();  

    String name();  

}  

二、角色定义

package annotation.rbac;  

public class Roles {  

public static final String ADMIN="admin";  

public static final String MANAGER="manager";  

public static final String TEACHER="teacher";  

public static final String STUDENT="student";  

}  

三、在控制器上使用注解

package annotation.rbac;  

public class UserController {  

@Rbac(name="添加用户",url="/admin/adduser",role={Roles.ADMIN,Roles.MANAGER})  

public String addUser(String username,String password){  

return "success";  

    }  

@Rbac(name="用户注销",url="/logout",role={Roles.ADMIN,Roles.MANAGER,Roles.STUDENT,Roles.TEACHER})  

public String logout()  

    {  

return "success";  

    }  

@Rbac(name="成绩查询",url="/query",role=Roles.STUDENT)  

public String query(){  

return "success";  

    }  

@Rbac(name="成绩录入",url="/insert",role=Roles.TEACHER)  

public String insert(){  

return "success";  

    }  

}  

四、注解解析器,用于提取RBAC规则。进行修改之后可对所有控制器进行分析并生成数据插入数据库。

package annotation.rbac;  

import java.lang.annotation.Annotation;  

import java.lang.reflect.Method;  

import java.util.HashMap;  

import java.util.Set;  

public class RbacParser {  

public static void main(String[] args) {  

try {  

HashMap roleTable=new HashMap<>();  

int ruleId=1;  

Class c = Class.forName("annotation.rbac.UserController");  

            Method[] methods=c.getMethods();  

for(Method m:methods){  

                Annotation[] annotations=m.getDeclaredAnnotations();  

for(Annotation annotation:annotations){  

if(annotation instanceof Rbac){  

                        Rbac rbacAnnotation=(Rbac) annotation;  

                        String url=rbacAnnotation.url();  

                        String name=rbacAnnotation.name();  

                        String[] methodRoles=rbacAnnotation.role();  

//后面需要将这条语句转换为SQL插入到数据库表rules  

System.out.printf("rule_id:%d name:%s url:%s\n",ruleId,name,url);  

//将角色具有权限的rule的编号拼接成逗号分隔的字符串,存放到HashMap  

for(String role:methodRoles){  

if(roleTable.containsKey(role)){  

                                String s=roleTable.get(role);  

roleTable.put(role, s+","+ruleId);  

}else{  

                                roleTable.put(role, String.valueOf(ruleId));  

                            }  

                        }  

                        ruleId++;  

                    }  

                }  

            }  

//后面需要将下面的输出语句转换为SQL插入到数据库表Roles  

            Set roleNames = roleTable.keySet();  

for(String roleName:roleNames){  

System.out.printf("role_name:%s rules:%s\n",roleName,roleTable.get(roleName));  

            }  

}catch (Exception e) {  

throw new RuntimeException(e);  

        }  

    }  

}  

相关文章

  • 使用Java注解实现RBAC规则的自动提取

    RBAC是各类系统中应用最广泛的访问控制机制。使用RBAC时,一个比较复杂的问题是维护数据库中的规则列表。本文使用...

  • Java注解学习总结(脑图)

    注解的提取测试:定义注解: 测试注解提取: 参考:《Java编程思想》java注解

  • spring框架(IOC) 注解

    7.4 使用注解实现自动装配 jdk1.5支持注解,Spring2.5开始支持注解。 要使用注解须知: 导入约束:...

  • springMVC的自定义annotation(@Retenti

    自定义注解: 使用@interface自定义注解时,自动继承了java.lang.annotation.Annot...

  • Spring之注解开发

    八、注解开发 目录:准备说明、Bean的实现、属性注入、衍生注解、自动装配注解、作用域、基于Java类进行配置 1...

  • Java中的注解&反射

    注解 注解声明 声明一个注解类型 Java中所有的注解,默认是实现Annotation接口: 注解的声明使用@in...

  • Java注解的使用

    Java注解的使用 参考 廖雪峰java教程 使用注解 什么是注解(Annotation)?注解是放在Java源码...

  • 一个简单的自定义注解

    1、定义一个自定义注解 2、使用注解 3、利用反射获取注解的值 java注解是怎么实现的?

  • @interface自定义注解的语法

    自定义注解:使用@interface自定义注解时,自动继承了java.lang.annotation接口,由编译程...

  • 打造简单的依赖注入功能

    让代码帮我们自动写代码。 目标:实现类似于Butterknife的id注入。首先先了解Java 的注解吧。注解的分...

网友评论

      本文标题:使用Java注解实现RBAC规则的自动提取

      本文链接:https://www.haomeiwen.com/subject/crubnxtx.html