1.权限
RBAC模型(Role-Based Access Control:基于角色的访问控制)
###### **RBAC**
```
RBAC(Role-Based Access Control)-基于角色的访问控制,模型是20世纪90年代研究出来的一种新模型,但从本质上讲,这种模型是对前面描述的访问矩阵模型的扩展。这种模型的基本概念是把许可权(Permission)与角色(Role)联系在一起,用户通过充当合适橘色的成员而获得该角色的许可权。
在实际的组织中,为了完成组织的业务工作,需要在组织内部设置不同的职位,职位既标识一种业务分工,又标识一种责任与权利。根据业务分工的需要,职位被划分给不同群体,各个群体的人根据其工作任务的需要被赋予不同的职责和权力,每个人有权了解与使用与自己任务相关的信息与资源,对于那些不应该被知道的信息则应该限制他们访问,这就产生了访问控制的需求。
RBAC的组成:用户、角色和权限。
User(用户):每个用户都有唯一的UID识别,并被授予不同的角色
Role(角色):不同角色具有不同的权限
Permission(权限):访问权限
用户-角色映射:用户和角色之间的映射关系
角色-权限映射:角色和权限之间的映射
2 关系
用户角色表(T_User_Role) 角色模块表(T_Role_Module)
用户------------------------>角色------------------------->权限
(T_User) (T_Role) (T_Module)
3.案例:显示菜单(数据库版本)
3.1主界面
<!-- 1.树形菜单 -->
<!--
组件的实现:
1.纯标签+class = easyui-tree
2.标签+js
-->
<!-- 创建UL容器即可实现搭建tree树形菜单 -->
<ul id = "menuTree"></ul>
</div>
<div data-options="region:'center',title:'内容区域'" style="padding: 5px; background: #eee;">
<!-- panel面板 -->
<div style = "margin:0px;padding:0px" id="p" class="easyui-panel" data-options="fit:true,closable:true,collapsible:true,minimizable:true,maximizable:true">
<!-- 选项卡区域 -->
<div id="myTabs" class="easyui-tabs" data-options = "fit:true"></div>
</div>
</div>
<!-- js -->
<script type="text/javascript">
//加载
$(function(){
//通过脚本的方式实现树形菜单
$("#menuTree").tree({
url:xPath+"/PromissionListServlet",
//设置节点的点击事件
onClick:function(node){//node 代表节点,点击 就能获取当前所点击的节点对象,根据node拿到指定的属性
//console.log(node);
//点击选项是,动态生成一个选项卡。
addTabs(node);
}
});
});
//封装一个函数存储添加选项卡的代码
function addTabs(node) {
//alert(node.url);
//如果没有url 则不生成tab选项卡
if(node.url===null || node.url==="" || node.url === undefined){
return;
}
//去重
let flag = $("#myTabs").tabs('exists',node.text);
if(flag){
$("#myTabs").tabs('select',node.text);
return;
}
//console.log(node);
$("#myTabs").tabs('add', {
//设置选项卡的标题
title : node.text,
//设置选项的关闭按钮
closable : true,
//选项卡内容
content : "<iframe src = '"+xPath+node.url+"' border='0' width = '100%' height = '100%'>"
});
}
//封装一个函数存储添加选项卡的代码
function addTabs2(node) {
//1.可以统一一级菜单的id全部为一个值 -1
/*
if(node.id === '-1'){
return;
}
*/
//2.通过判断节点
if (node.children != null) {
return;
}
//判断即将生成的选项卡是否已存在?
let flag = $("#myTabs").tabs('exists', node.text);
if (flag) {
//如果存在,就默认选中
$("#myTabs").tabs('select', node.text);
return;
}
$("#myTabs").tabs('add', {
//设置选项卡的标题
title : node.text,
//设置选项的关闭按钮
closable : true,
//选项卡内容
content : "<h1>我是内容</h1>"
});
}
</script>
3.2servlet
// 1.设置编码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("utf-8");
// text/html;charset=utf-8
response.setContentType("application/json;charset=utf-8");
// 2.获取请求参数(省略)
// 3.根据获取的参数处理请求
// 实例化biz
IPromissionBiz ipb = new PromissonBizImpl();
List<Promission> promissionAll = ipb.getPromissionAll(-1);
// 4.响应
// 获取JSON工具
ObjectMapper mapper = new ObjectMapper();
String result = mapper.writeValueAsString(promissionAll);
//获取out
PrintWriter out = response.getWriter();
out.write(result);
out.flush();
out.close();
3.3dao方法
public List<Promission> getPromissionAll(Integer pid) {
Connection conn = null;//连接对象
PreparedStatement ps = null;//执行对象
ResultSet rs = null;//结果集对象
List<Promission> list = new ArrayList<Promission>();//集合
String sql = null;//sql
Promission promission = null;//实体
try {
//获取数据库连接
conn = DBHelper.getConn();
//sql
sql = "select id,text,pid,icon,url,state,sort from tb_promission where pid = ? order by sort asc";
//ps
ps = conn.prepareStatement(sql);
//占位符
ps.setInt(1, pid);
//rs
rs = ps.executeQuery();
while(rs.next()) {
promission = new Promission();
//设置
promission.setId(rs.getInt(1));
promission.setText(rs.getString(2));
promission.setPid(rs.getInt(3));
promission.setIcon(rs.getString(4));
promission.setUrl(rs.getString(5));
promission.setState(rs.getInt(6));
promission.setSort(rs.getInt(7));
list.add(promission);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
}
return list;
}