目录
一、权限系统
(1)访问控制策略
1、自由型访问控制
自由型访问控制:用户|对象来决定访问权限。信息的所有者来设定谁有权限来访问信息以及操作类型(读,写,执行...)是一种基于身份的访问控制。例如UNIX权限管理。
2、强制性访问控制
强制性访问控制:系统来决定访问权限。安全属性是强制型的规定,它由安全管理员或操作系统根据限定的规则确定的,是一种规则的访问控制。
3、基于角色的访问控制
基于角色的访问控制:角色决定访问权限。用组织角色来同意或拒绝访问。比MAC,DAC更灵活,适合作为大多数公司的安全策略,但对一些机密性高的政府系统不适用。(RBAC模型 )。
4、规则驱动的基于角色的访问控制
规则驱动的基于角色的访问控制:提供了一种基于约束的访问控制,用一种灵活的规则描述语言和ixn的信任规则执行机制来实现。
5、基于属性证书的访问控制
基于属性证书的访问控制:访问权限信息存放在用户属性证书的权限属性中,每个权限属性描述了一个或多个用户的访问权限。但用户对某一资源提出访问请求时,系统根据用户的属性证书中的权限来判断是否允许或拒绝。
(2)RBAC模型
1、RBAC是什么?
RBAC 是基于角色的访问控制(Role-Based Access Control )在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便。
2、RBAC重要对象:
(1)用户(User):角色施加的主体;用户通过拥有某个或多个角色以得到对应的权限
(2)角色(Role):一组权限的集合
(3)权限(Permission):用户限定能够访问的一个资源【注意】一个用户拥有若干角色,一个角色拥有若干权限,这样就构成了用户-角色-权限的授权模型。
(3)权限系统的组成
1、用户表
用户表:主键id,用户名,用户邮箱,是否为管理员,状态,创建时间,更新时间,......
2、角色表
角色表:角色id,角色名,状态,创建时间,更新时间
3、权限表
权限表(菜单权限表):权限id,权限标题,权限父级id,图标,权限路径,状态,排序,创建时间,更新时间,......
4、用户角色表
用户角色表:主键id,用户id,角色id,创建时间,更新时间
5、角色权限表
角色权限表:主键id,角色id,权限id,创建时间,更新时间,......
二、示例显示
(1)创建权限表(菜单表)
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);
(2)编写数据库帮助类、实体类
1、数据库帮助类
基于oracle的数据库帮助类
2、实体类
多加一个集合属性(其他属性与数据库创表一致)与json相匹配
private List<Promission> children = new ArrayList<Promission>();
(3)编写数据访问层和业务逻辑层
1、数据访问层
根据父级pid查询所有信息
@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; }
2、业务逻辑层
利用递归的方法实现最后的查询
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; }
(4)编写数据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(); } }
(5)jsp页面布局显示
其中点击显示内容将在下次实现(404解决方案将于明天解决)
<%@ 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: 170px; height: 500px;;"></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' width =100% height =100%>", 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>
好的,以上便是今天的内容了,我们下次再见!!!