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

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);  

        }  


    }  


}  

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容