RBAC模型
基于角色的访问控制权限:用户通过角色与权限关联,一个用户拥有多个角色,一个角色拥有多个权限,用户与角色,角色与权限都是多对多的关系。
RBAC级别:
RBAC0:包括角色R、用户U、许可权P
RBAC1:引入角色之间的继承关系,包括一般继承关系(允许角色间的多继承)和受限继承关系(角色间的单继承)。
RBAC2:角色的访问控制。责任分离包括静态责任分离和动态责任分离。约束与用户-角色-权限关系一起决定了RBAC2模型中用户的访问许可,此约束有多种。互斥角色、基数约束、先决条件角色、运行时互斥。
RBAC3:也就是最全面级的权限管理,它是基于RBAC2的基础上,将RBAC1和RBAC2进行整合了,最全面,也最复杂的。
【基本模型RBAC0定义了完全支持RBAC概念的任何系统的最低需求。RBAC1和RBAC2两者都包含RBAC0,但各自都增加了独立的特点,它们被称为高级模型。RBAC1中增加了角色分级的概念,一个角色可以从另一个角色继承许可权。RBAC2中增加了一些限制,强调在RBAC的不同组件中在配置方面的一些限制。RBAC3称为统一模型,它包含了RBAC1和RBAC2,利用传递性,也把RBAC0包括在内。这些模型构成了RBAC96模型族。】
角色模块-权限分配
1、后台提供查询所有权限的代码;
2、准备显示权限树的模态框,模态框中不再是from表单,而是ztree的容器;
3、给role.jsp页面中的分配权限按钮绑定单击事件(通过动态委派的方式,或者在标签中通过onclick调用处理单击事件的函数,这里用的是后者。)(可根据下面代码顺便回顾一下ztree的使用步骤)
function assignPermission(roleid){
$.ajax({
"type":"get",
"url":"${PATH}/permission/permissions",
"success":function (permissions) {
//permissions是JSON数组
//将异步查询到的权限集合显示到模态框中
//1、引入ztree的文件
//2、准备ztree容器ztreeContainer
//3、创建ztree的配置对象
var setting={
check: {
enable: true//启用复选框
},
view: {
addDiyDom: function (treeId,treeNode) {
$("#"+treeNode.tId+"_ico").remove();
$("#"+treeNode.tId+"_span").before("<span class='"+treeNode.icon+"'/>");
}
},
key:{
name:"title"
},
data: {
simpleData: {
enable: true,
pIdKey: "pid"
}
}
};
//4、准备数据源
var zNodes=permissions;
//5、初始化数据创建成ztree树显示到容器中
var $ztreeObj = $.fn.zTree.init($("#ztreeContainer"),setting,zNodes);
$ztreeObj.expandAll(true);
//6、显示模态框
$("#permissionModal").modal("show");
}
});
}
4、回显当前角色已经分配的权限。但是上面的代码有一个缺陷就是已经分配的权限在查询的时候没有勾选,显示的都是未勾选的,这样用户就不知道自己以前有哪些权限了,所以需要改善。也就是回显当前角色已经分配的权限。
思路:首先根据roleid查询到已经拥有的权限id集和assignedPermissionIds(后端代码),遍历所有的权限集和,如果当前的权限id和assignedPermissionIds中的某个id一样,那么给他设置checked属性值为true(前端实现)。
后端代码:
//permissionServiceImpl
@Autowired
TRolePermissionMapper rolePermissionMapper;
@Override
public List<Integer> getAssginedPermissionIdsByRoleId(Integer roleid) {
TRolePermissionExample exa = new TRolePermissionExample();
exa.createCriteria().andRoleidEqualTo(roleid);//在角色权限关联表中,根据主键id查询,已给的是roleid。所以只要roleid是等于我们指定的,则根据roleid的id删除。***********
List<TRolePermission> rolepermissions= rolePermissionMapper.selectByExample(exa);//获取的是已经分配角色权限id的对象集和
List<Integer> permissionsids = new ArrayList<>();
for (TRolePermission rolepermission : rolepermissions) {
permissionsids.add(rolepermission.getPermissionid());
}
return permissionsids;
}
//PermissionController
@Autowired
PermissionService permissionService;
//2、查询指定角色已经拥有的权限id集和
@ResponseBody
@RequestMapping("/assignedPermissionIds")
public List<Integer> getAssginedPermissionIds(Integer roleid){
return permissionService.getAssginedPermissionIdsByRoleId(roleid);
}
前端改善代码如下:
function assignPermission(roleid) {
$.ajax({
"type": "get",
"url": "${PATH}/permission/permissions",
"success": function (permissions) {
console.log(permissions);
//查询到所有的权限后再发起异步请求查询roleid角色已经拥有的权限id列表
$.ajax({
"type": "get",
"url": "${PATH}/permission/assignedPermissionIds",
"data": {"roleid": roleid},
"success": function (assignedPermissionIds) {
// 遍历所有的权限集和,如果当前的权限id和assignedPermissionIds中的某个id一样,那么给他设置checked属性值为true
for(var i = 0;i<permissions.length;i++){
if(assignedPermissionIds.indexOf(permissions[i].id)>=0){
permissions[i].checked=true
}
}
//注意**:因为两次异步请求会出现资源不同步的问题,所以要将后面的代码放到第二个异步请求里面
//permissions是JSON数组
//将异步查询到的权限集合显示到模态框中
//1、引入ztree的文件
//2、准备ztree容器ztreeContainer
//3、创建ztree的配置对象
var setting = {
check: {
enable: true//启用复选框
},
view: {
addDiyDom: function (treeId, treeNode) {
$("#" + treeNode.tId + "_ico").remove();
$("#" + treeNode.tId + "_span").before("<span class='" + treeNode.icon + "'/>");
}
},
key: {
name: "title"
},
data: {
simpleData: {
enable: true,
pIdKey: "pid"
}
}
};
//4、准备数据源
var zNodes = permissions;
//5、初始化数据创建成ztree树显示到容器中
var $ztreeObj = $.fn.zTree.init($("#ztreeContainer"), setting, zNodes);
$ztreeObj.expandAll(true);
//6、显示模态框
$("#permissionModal").modal("show");
}
});
}
});
}
后面代补。。。。