权限设计主要有一下几大部分组成:PassPort:针对现在系统的分析,系统之间有部分信息是共享的,这部分信息将由中心话的Passport来统一维护
1.2权限设计的原则
2.资源权限解决方案
2.1概览
资源权限绑定概览
项目开发和测试阶段:
在项目上线之后和运维阶段:
2.2管理类型和普通类型
分组和角色分别都有两种类型,一种是管理类型,一种是普通类型,以下做详细说明:
分组表设计(Group)
列
类型
空
说明
Id
Number(10)
Notnull
PK
Name
Varchar2(128)
组名称
Admin
Boolean
是否为管理类型
以上三点其实都可以归结为第三点,即:任何页面可见的元素均可纳入功能级权限管理。实现方法:采用自写JSP标签完成,执行该标签时需要从后台或缓存中查找当前用户是否有使用当前资源的权限,如果有则正常显示,如果没有则将标签内所有内容从服务端剔除后再响应客户端。如下图:
资源权限流程
3.1标签实现的代码
4.安全性设计
页面元素的可见性并不能控制URL的可访问性,在系统设计中,使用Struts2的拦截器机制来过滤URL,防止用户不通过页面直接通过URL访问系统。系统资源的抽取设计。系统资源包含了以上提到的两个部分页面元素和URL,两种资源在某些时候是可组合的,比如按钮点击后提交URL,则该按钮与该URL可组成一个资源。页面元素可独立成为一个资源,而URL不能脱离页面元素独立成为资源。每个资源都有唯一的标标识。资源与资源之间也存在层级关系,比如下图:
4.1资源表设计
列名类型(长度)可否空
Keyvarchar2(256)notnull
标识资源的唯一的代码
Namevarchar2(256)notnull
资源名称
Urlvarchar2(256)null
对应的URL
Parent_keyvarchar2(256)null
父资源代码
Descvarchar2(256)null
描述或备注信息
Key值的设定建议采用会意的字符串,比如新增按钮资源属于第三级资源则它的代码应该为"sysres_duty_add".
对资源进行管理的树状插件
4.3插件使用方式:
如何在struts中使用资源权限tag:
5.数据权限方案
5.1业务关键字定义:
数据权限业务关键字定义
5.2设计思路和原则
5.3什么是岗码
岗码大体结构
5.4岗码定义和阅读规则
岗码的格式规则
岗码格式如下:
岗位ID_岗位类型(管理/业务)_岗位职位_工贸ID_渠道ID_经营体ID_产品线code_BUCode_品牌_型号经营体.注意:根据业务需要,岗码会不断的扩充,以存储更多用于分析查询的信息.
5.5岗码生成和岗码从数据库刷新至业务服务器
岗码生成和岗码从数据库刷新至业务服务器
定时更新策略每天定时执行岗码更新SQL脚本,更新数据库中的岗码,并且定时重置内存中的数据缓存。这里建议采用增量式更新,否则对数据库压力过大。这里所使用的SQL脚本可参考下面第2点实时更新策略所使用的脚本。实时更新策略对于更新相对较频繁的表(如人员表、岗位表),首先在该表上设立触发器,基于表做的所有修改将记录到历史表中,系统定时扫描历史表,发现改动则执行SQL脚本更新岗码,并更新缓存。这里的更新指单条记录的更新,非批量更新。
当蓝色部分使用应用服务的时候可以直接更新缓存,从而略过橙色部分活动图。历史表ecc_oms.sys.his
IdNumber(12)notnullPK
Table_namevarchar2(128)notnull
表名
PK_Valuevarchar(512)notnull
主键值如:123,张三
PK_namevarchar(128)notnull
主键字段如:empId,empName
Oper_typenumber(2)notnull
操作类型:增:1、删:2、改:3
Create_timeDatenotnull
flagvarchar2(1)notnull
完成标记位:0:未完成,1完成
5.6如何存储岗码:
(1)新增用户-岗位关系表和岗位-用户岗码关系表:ecc_oms.sys_emp_codeEmp_id:用户IDCode_id:岗码ID-对应ecc_oms.ecc_oms.sys_code表主键(2)岗位-客户岗码关系表:ecc_oms.ecc_oms.sys_cust_codeCust_code:客户codeCode_id:岗码ID
5.7如何从数据库刷新岗码到应用服务器
主要类列表和简单描述:
类/接口名
简介
核心接口描述
CacheServiceFacade
暴露给客户端远程调用的接口
1.根据用户id和岗位查询该用户的客户列表,返回结果集自动关联客户对应的产品线信息publicSet
DefaultCacheServiceFacade
CacheServiceFacade的默认实现类,根据请求的岗位类型自动判断查找客户信息
CacheService
从缓存中读取数据的顶层接口,定义内存中数据的读取接口
1.根据用户id查找用户信息publicSet
AbstractCacheService
CacheService的抽象实现,读取客户数据的公共方法抽取在里面
CacheServiceA
AbstractCacheService的子类实现,为MD_XSJL下单门店销售经理查找客户逻辑
CacheServiceB
AbstractCacheService的子类实现,BU代表下单
AbstractCacheService的子类实现,查询权限信息实现
CacheLoader
缓存加载器
1.将指定表的数据加载到内存中publicvoidinitCache(Class<>clazz,RowMapper<>mapper,String[]properties);2.缓存加载完毕后获取缓存后的所有对象publicTableCachegetTableCache();
DefaultCacheLoader
CacheLoader接口的实现类
TableOperation
对单表进行的操作接口,用户往操作历史里插入记录时单条更新/删除缓存操作
1.根据操作记录对缓存进行操作publicvoidexecute(OperationContextoperationContext);
AbstractTableOperation
TableOperation的抽象实现,定义公共操作方法
BasGCustomerInfoTableOperationStationConfigTableOperationStationCustomerRelationTableOperationStationCustomerRelationTableOperationStationEmployeeRelationTableOperation
AbstractTableOperation类的子类,表示对指定的表进行增/删/改动作时的响应操作
ReloadTableCacheJob
定时任务,重新载入主数据表到缓存,每小时执行一次
UpdateCacheJob
根据操作历史记录,对缓存中的数据进行单条更新,每15分钟执行一次
UpdateCodeJob
定时任务,定期扫描岗码历史表ecc_oms.sys_his,调用存储过程,触发更新岗码操作,每10分钟执行一次
5.8如何使用数据权限接口,调用简单示例
在客户端调用的应用中定义一个springbean,如下:
Java代码调用:
5.9如何添加新数据权限接口
将需要客户端调用的接口方法添加在CacheServiceFacade类中,并编写实现类。