一:权限系统
①:访问控制策略
访问控制策略一般有以下几种方式:
(1)自由型访问控制:用户|对象来决定访问权限。信息的所有者来设定谁有权限来访问信息以及操作类型(读,写,执行...)是一种基于身份的访问控制。例如UNIX权限管理。
(2)强制性访问控制:系统来决定访问权限。安全属性是强制型的规定,它由安全管理员或操作系统根据限定的规则确定的,是一种规则的访问控制
(3)基于角色的访问控制:角色决定访问权限。用组织角色来同意或拒绝访问。比MAC,DAC更灵活,适合作为大多数公司的安全策略,但对一些机密性高的政府系统不适用。
(4)规则驱动的基于角色的访问控制:提供了一种基于约束的访问控制,用一种灵活的规则描述语言和ixn的信任规则执行机制来实现。
(5)基于属性证书的访问控制:访问权限信息存放在用户属性证书的权限属性中,每个权限属性描述了一个或多个用户的访问权限。但用户对某一资源提出访问请求时,系统根据用户的属性证书中的权限来判断是否允许或拒绝。
重点:本次实现基于角色的访问控制策略方式
②:RBAC模型
RBAC模型(Role-Based Access Control)-简称基于角色的访问控制,是20世纪90年代研究出来的一种新模型,但从本质上讲,这种模型是对前面描述的访问矩阵模型的扩展。这种模型的基本概念是把许可权(Permission)与角色(Role)联系在一起,用户通过充当合适橘色的成员而获得该角色的许可权。
在实际的组织中,为了完成组织的业务工作,需要在组织内部设置不同的职位,职位既标识一种业务分工,又标识一种责任与权利。根据业务分工的需要,职位被划分给不同群体,各个群体的人根据其工作任务的需要被赋予不同的职责和权力,每个人有权了解与使用与自己任务相关的信息与资源,对于那些不应该被知道的信息则应该限制他们访问,这就产生了访问控制的需求。
举个栗子:
在一个大学中,有校长,副校长,训练部长,组织处长,科研处长,教保处长等不同的职位,在通常情况下,职位所赋予的权利是不变的,但在某个职位上的工作的人可以根据需要调整,RBAC模型对组织内部的这些关系与访问控制要求给出了非常恰当的描述。
RBAC重要对象:
用户(User):角色施加的主体;用户通过拥有某个或多个角色以得到对应的权限
角色(Role):一组权限的集合
权限(Permission):用户限定能够访问的一个资源
注意:
一个用户拥有若干角色,一个角色拥有若干权限,这样就构成了用户-角色-权限的授权模型
组成:
- 用户表:主键id,用户名,用户邮箱,是否为管理员,状态,创建时间,更新时间,......
- 角色表:角色id,角色名,状态,创建时间,更新时间
- 权限表(菜单权限表):权限id,权限标题,权限父级id,图标,权限路径,状态,排序,创建时间,更新时间,......
- 用户角色表:主键id,用户id,角色id,创建时间,更新时间
- 角色权限表:主键id,角色id,权限id,创建时间,更新时间,......
/*权限表(菜单表)*/
create table tb_promission
(
id number primary key,--权限id
text varchar2(100) not null,--权限名称
pid number not null,--权限父级id
icon varchar2(100),--菜单显示的icon
url varchar2(100),--权限资源路径
state number,--状态;该记录是否有效1:有效、0:无效
sort number--排序码
)
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(1,'店铺管理',-1,'','',1,1);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(2,'图书分类管理',-1,'','',1,2);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(3,'图书管理',-1,'','',1,3);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(4,'订单管理',-1,'','',1,4);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(5,'系统设置',-1,'','',1,5);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(6,'店铺添加',1,'','/addshop.jsp',1,6);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(7,'店铺列表',1,'','/shopList.jsp',1,7);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(8,'图书分类添加',2,'','/addBookType.jsp',1,8);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(9,'图书分类列表',2,'','/addBookTypeList.jsp',1,9);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(10,'图书添加',3,'','/addBook.jsp',1,10);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(11,'图书列表',3,'','',1,11);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(12,'所有图书',11,'','/addBookList.jsp',1,12);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(13,'未上架',11,'','/notAvailableBook.jsp',1,13);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(14,'已上架',11,'','/listedBook.jsp',1,14);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(15,'已下架',11,'','/removedBook.jsp',1,15);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(16,'所有订单',4,'','/orderList.jsp',1,16);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(17,'未付款订单',4,'','/UnpaidOrder.jsp',1,17);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(18,'已付款订单',4,'','/PaidOrder.jsp',1,18);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(19,'未收货订单',4,'','/UnconscionedOrder.jsp',1,19);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(20,'已完成订单',4,'','/DoneOrder.jsp',1,20);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(21,'系统设置',5,'','/SystemSettings.jsp',1,21);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(22,'菜单管理',5,'','/MenuManagement.jsp',1,22);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(23,'权限管理',5,'','/PermissionManagement.jsp',1,23);
insert into tb_promission(id,text,pid,icon,url,state,sort) values
(24,'用户管理',5,'','/UserManagement.jsp',1,24);
二:三层结构实现基于角色的访问控制策略方式
1.建包
- biz业务逻辑处理包
- dao 数据访问层
- entity 实体类
- servlet servlet类
- utils 数据库帮助类
---------------------------------- dao数据访问方法层--------------------------------------------------------------
package com.zking.ht.promission.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.zking.ht.promission.dao.IPromissionDao;
import com.zking.ht.promission.entity.Promission;
import com.zking.ht.promission.utils.DBHelper;
public class PromissionDaoImpl implements IPromissionDao {
@Override
public List<Promission> qurryPromissionAll(int pid) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Promission> list = new ArrayList<Promission>();
Promission promission = null;
String sql = "";
try {
conn = DBHelper.getConn();
sql = "select id,text,pid,icon,url,state,sort from tb_Promission where pid =?";
ps = conn.prepareStatement(sql);
ps.setInt(1, pid);
rs = ps.executeQuery();
while (rs.next()) {
promission = new Promission();
promission.setId(rs.getInt("id"));
promission.setText(rs.getString("text"));
promission.setPid(rs.getInt("pid"));
promission.setIcon(rs.getString("icon"));
promission.setUrl(rs.getString("url"));
promission.setState(rs.getInt("state"));
promission.setSort(rs.getInt("sort"));
list.add(promission);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(conn, ps, rs);
}
return list;
}
public static void main(String[] args) {
List<Promission> qurryPromissionAll = new PromissionDaoImpl().qurryPromissionAll(-1);
System.out.println(qurryPromissionAll);
}
}
--------------------------------------------------servlet类-------------------------------------------------------------------
package com.zking.ht.promission.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zking.ht.promission.biz.IPromissionBiz;
import com.zking.ht.promission.biz.impl.PromissionBizImpl;
import com.zking.ht.promission.entity.Promission;
@WebServlet("/promissionListServlet.do")
public class PromissionListServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/json;charset=utf-8");
IPromissionBiz ipb = new PromissionBizImpl();
List<Promission> list = ipb.qurryPromissionAll(-1);
ObjectMapper mapper = new ObjectMapper();
String reuslt = mapper.writeValueAsString(list);
PrintWriter out = response.getWriter();
System.out.println(reuslt);
out.write(reuslt);
out.flush();
out.close();
}
}
2.在biz层中扩展查询方法,便于获取Children元素
package com.zking.ht.promission.biz.impl;
import java.util.List;
import com.zking.ht.promission.biz.IPromissionBiz;
import com.zking.ht.promission.dao.IPromissionDao;
import com.zking.ht.promission.dao.impl.PromissionDaoImpl;
import com.zking.ht.promission.entity.Promission;
public class PromissionBizImpl implements IPromissionBiz {
IPromissionDao ipd = new PromissionDaoImpl();
@Override
public List<Promission> qurryPromissionAll(int pid) {
List<Promission> list = ipd.qurryPromissionAll(pid);
for (Promission promission : list) {
if(promission.getUrl() == null || "".equals(promission.getUrl())) {
promission.setChildren(qurryPromissionAll(promission.getId()));
}
}
return list;
}
public static void main(String[] args) {
List<Promission> qurryPromissionAll = new PromissionBizImpl().qurryPromissionAll(2);
for (Promission promission : qurryPromissionAll) {
System.out.println(promission);
}
}
}
3.完善主界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<%@ include file="static/common/easyuibase.jsp"%>
</head>
<body>
<div id="cc" class="easyui-layout" data-options="fit:true">
<div data-options="region:'north',title:'首页头部',split:true"
style="height: 100px;"></div>
<div data-options="region:'south',title:'版权信息',split:true"
style="height: 100px;"></div>
<div data-options="region:'west',title:'菜单栏',split:true"
style="width: 170px;">
<div id="mytree" class="easyui-accordion"
style="width: 300px; height: 200px;"></div>
<script type="text/javascript">
$(function() {
$('#mytree').tree({
url:xPath+'/promissionListServlet.do',
onClick:function(node){
addMyTabs(node);
}
});
});
function addMyTabs(node) {
if(node.id === '-1'){
return;
}
var flag = $("#maintabs").tabs('exists',node.text);
if(flag){
$("#maintabs").tabs('select',node.text);
return;
}
$("#maintabs").tabs('add',{
title: node.text,
content:"<iframe src = 'dodo.jsp'>",
closable:true,
})
}
</script>
</div>
<div data-options="region:'center',title:'内容'"
style="padding: 5px; background: #eee;">
<div id="maintabs" class="easyui-tabs" data-options="fit:true">
</div>
</div>
</div>
</body>
</html>