前提:
客户端界面上显示的所有元素 ,创建时绑定 自定义的ID -- 资源ID
表设计:
角色表:
int 角色码 role_id
资源表:
int 资源码id res_id , int 角色码复合码 role_id
用户表:
int 用户码id user_id ,int 角色码复合码 role_id
核心: role_id 的位运算
例子:
当前用户存在角色 A role_id = 1 ; B role_id = 2 ; C role_id = 4
计算系统全局 可用角色 总数 : 1+2+4 = 7
当前登陆用户拥有权限 : 5 , 分解-> 1 + 4 -> 拥有角色A ,C
代码实现登陆流程:
//模拟 资源与角色 关系表
List<Res> list = new ArrayList<>();
list.add(new Res(1,"首页菜单1"));
list.add(new Res(2,"用户信息模块2"));
list.add(new Res(4,"公告栏3"));
list.add(new Res(2,"标题多选框4"));
list.add(new Res(5,"点击按钮5"));
// 1 2 4
int roleAll = 7;
int rid = 5;
//判断当前用户有效权限
int accessRid = rid & roleAll;
System.out.println( "当前用户有效角色总数:" + accessRid );
List<Res> alist = new ArrayList<>();
//根据角色抓取资源
for (Res res : list){
if (( res.rid & accessRid ) > 0){
alist.add(res);
}
}
if (alist.size()>0) {
System.out.println("登陆成功"+ alist);
}
else System.out.println("登陆失败");
模拟结果:
当前用户有效角色总数:5
登陆成功[
{rid=1, resId='首页菜单1'},
{rid=4, resId='公告栏3'},
{rid=5, resId='点击按钮5'}]
优点:
1. 动态添加资源与角色的关系
2.全局控制用户
3.动态绑定用户与资源的关系
4.自行体会
缺点: 系统最多可设置63个角色后 需要关联二级角色表
灵感来源liunx权限管理