基于SSM框架的通用权限框架设计
Posted 李慕白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于SSM框架的通用权限框架设计相关的知识,希望对你有一定的参考价值。
1. 整体解决方案概述
权限设计主要有一下几大部分组成:
PassPort:
针对现在系统的分析,系统之间有部分信息是共享的,这部分信息将由中心话的Passport来统一维护
权限订阅模块:
负责订阅接受Passport发出的相关实体修改的信息。
资源权限绑定:
有效的将资源-角色-组-成员在数据库中简历绑定。
数据权限高速内存数据缓存:
将数据权限相关的数据缓存在内存,提供高性能访问能力。
Struts页面权限过滤和绑定:
使用Struts的tag动态根据资源权限的设置,决定页面中资源(按钮,菜单,URL,页面元素)的访问能力。
数据权限过滤:
根据数据过滤权限的特定,定义的数据权限过滤的通用数据结构。
根据业务集成和整合的需要,和优先级别的需要,权限部分的开发设计将逐步推进,初期会以各应用系统为单元进行资源权限和数据权限的改造,随后将根据重要业务系统的需要,逐步建立中心话的passport。
(1)功能级授权采用通常的权限分组,角色绑定资源的通用设计思路来完成。基本设计思路如下图:
资源:
菜单,按钮,URL,页面中的任何元素。
角色:
根据业务定义的各种角色,比如订单生成角色,结算角色等。
组:
用于联系角色和用户。
用户:
系统中登录的用户。
(2)资源权限在开发,测试,项目上线后维护中的不同作用:
项目开发和测试阶段:
- 项目开发人员和业务人员共同确定什么资源需要权限管理并在系统中定义资源。
- 在页面当中定义控制资源访问的tag。
- 根据业务模块的不同定义相应的增删改查的角色。
- 绑定角色和资源。
在项目上线之后和运维阶段:
- 在需要的时候可以继续建立更多的角色,并绑定角色和已有的资源。
- 建立用户组。
- 绑定用户组和已有的角色。
- 为用户组指定管理员,并授予管理员管理用户组的权限,用户组的管理员一般是业务人员的领导。
- 用户组管理员根据本部门的需要和调整,来动态的增减用户组的成员。
- 被加入用户组的成员立刻获得系统相应访问资源的访问和使用权限,无需修改代码。
分组和角色分别都有两种类型,一种是管理类型,一种是普通类型,以下做详细说明:
列 | 类型 | 空 | 说明 |
Id | Number(10) | Not null | PK |
Name | Varchar2(128) | Not null | 组名称 |
Admin | Boolean | Not null | 是否为管理类型 |
功能级授权的意义在于对页面可见元素的操作性,单纯从页面的可见性可简单划分成如下几个部分:
- publicclassAuthTagextendsStrutsBodyTagSupport{
- private Set<String>authCodeSet;
- publicvoidsetCode(String code) {
- String[] codes = code.split(",");
- authCodeSet = newHashSet<String>(Arrays.asList(codes));
- }
- publicintdoStartTag() throwsJspException {
- HttpSessionhttpSession = pageContext.getSession();
- Authentication authentication = (Authentication)httpSession.getAttribute(SessionSecurityConstants.KEY_AUTHENTICATION);
- if(authentication == null){
- returnSKIP_BODY;
- }
- if(hasAuth(authentication)){
- returnEVAL_BODY_INCLUDE;
- }
- returnSKIP_BODY;
- }
- privatebooleanhasAuth(Authentication authentication){
- for(String auth: authCodeSet){
- if(authentication.getComponentResources().contains(auth)){
- returntrue;
- }
- }
- returnfalse;
- }
- }
列名类型(长度) 可否空 | 说明 |
Key varchar2(256) not null | 标识资源的唯一的代码 |
Name varchar2(256) not null | 资源名称 |
Url varchar2(256) null | 对应的URL |
Parent_key varchar2(256) null | 父资源代码 |
Desc varchar2(256) null | 描述或备注信息 |
Key值的设定建议采用会意的字符串,比如新增按钮资源属于第三级资源则它的代码应该为"sysres_duty_add".
- <%@ taglib prefix="hop" uri="/restree" %>
- <res:treeurlres:treeurl="resTree.action"
- expandUrl="expandResTree.action"
- async="true"
- chkType="check"
- id="demoTree"/>
岗位ID_岗位类型(管理/业务)_岗位职位_工贸ID_渠道ID_经营体ID_产品线code_BUCode_品牌_型号经营体.
注意:根据业务需要,岗码会不断的扩充,以存储更多用于分析查询的信息.
当蓝色部分使用应用服务的时候可以直接更新缓存,从而略过橙色部分活动图。
历史表ecc_oms.sys.his
列名类型(长度) 可否空 | 说明 |
Id Number(12) not null PK | PK |
Table_name varchar2(128) not null | 表名 |
PK_Valuevarchar(512) not null | 主键值如:123, 张三 |
PK_namevarchar(128) not null | 主键字段如:empId, empName |
Oper_type number(2) not null | 操作类型:增:1、删:2、改:3 |
Create_time Date not null | 创建时间 |
flag varchar2(1) not null | 完成标记位: 0:未完成,1完成 |