权限管理
一、权限控制总论
----------------------------------------------------------------------------------------------
权限控制可以归结为一句话:哪些人对哪些资源做哪些操作
哪些人一般有两种视角,一种是基于用户和系统,相关的关键字有:用户、角色、用户组等
第二种是基于组织结构或者HR的视角,相关的关键字有:员工、岗位、职务、部门等
熊猫采用第二种视角,在这种视角下,员工、岗位、职务、部门统一称之为“授权主体(AuthorizationPrincipal)”,授权主体可以拥有权限,最终都体现在员工上,目前可以对岗位和部门进行授权,组织结构是树状关系,下级组织结构的权限自动继承上级组织结构的权限
![](http://images0.cnblogs.com/blog/490358/201502/282103349088961.png)
哪些资源有广义的资源和狭义的资源,广义的资源指的是企业管理一切要管理的事物,讨论没有意义。狭义的资源指的是产品中进行权限控制的界面和业务数据等,在Panda中资源就是ResourceNode对应的领域对象。更多ResourceNode的资料请参见Netsharp总体介绍1.3.3节。
哪些操作也有广义和狭义的概念,在Panda中操作主要分成三种,功能权限、数据权限、字段权限。功能权限主要控制一个按钮能不能操作,一个页面能不能打开;数据权限可以理解为行级别的权限,即多条记录中你可以看哪部分,常见的数据权限是基于组织机构的;字段权限可以理解为数据库列权限,即一些敏感的字段你能不能看,比如客户手机号和销售金额。
字段权限是特殊的功能权限,甚至某些数据权限也可以认为是特殊的功能权限,功能权限请查看如下场景:
![](http://images0.cnblogs.com/blog/490358/201502/282104147836346.png)
这个表分成内容、列头、行头三个部分,内容称之为"操作(Operation)"列头称之为"资源(ResourceNode)",行头称之为"操作类型(OperationType)",
通过考察上表,可以得出如下结论:操作(Operation) = 资源(ResourceNode)+ 操作类型(OperationType)
说明:权限控制还有一些高级的概念,比如权限互斥、分级授权、权限代理、多组织权限、项目管理等,panda暂时不做这些功能。
二、权限管理静态结构
----------------------------------------------------------------------------------------------下面是权限管理的静态结构总图:
![](http://images0.cnblogs.com/blog/490358/201502/282104301113963.png)
panda的实体类参考如下目录:
/netsharp/src/org/netsharp/orgnization/entity
三、权限控制场景
----------------------------------------------------------------------------------------------
一)登录/注销
权限的控制起始于登录,结束于注销或者Session失效
权限的配置一般放在Session中,提升效率
登录时添加配置数据到Session中,注销或者Session失效时候释放配置数据,配置数据使用类型:
org.netsharp.orgnization.controller.authorization.UserPermission
public class UserPermission {
private Employee employee; // 员工
private List<Operation> operations; // 当前员工的操作权限
private Map<String, List<String>> fieldGeteways; // 当前员工的字段权限
private boolean isPermission; // 是否已经加载了权限数据
}
|
Session管理器相关接口
public class UserPermissionManager {
// 从Session中得到用户权限设置
public static UserPermission getUserPermission();
// 释放用户权限设置
// session注销或者注销时执行
public static void removeSession();
// 根据员工添加Session
public static void addSession(Employee employee);
}
|
Session注销时在JSP中,通过注册自定义的Listener 实现:
com.ykx.web.servlet.PandaSessionListener ,在该类中实现sessionDestroyed方法即可,
public void sessionDestroyed(HttpSessionEvent arg0) {
UserPermissionManager.removeSession();
}
|
重要:从数据库中查询用户的功能权限
参考代码:org.netsharp.orgnization.controller.authorization.UserPermissionManager
二)导航级权限/功能按钮权限
功能权限控制的思路如下:
1.开发人员在数据库中新增一个操作(Operation)(例如:销售订单新增权限,其中订单是ResourceNode,新增时OperationType)
同时在销售订单界面的新增按钮上(ToolbarItem)设置对应这个操作
2.正式环境中,管理员把订单的新增操作权限授权给某个岗位,此时会新增一个PrincipalOperation对象
3.当一个用户登录时,系统会查询这个用户的所有岗位的所有操作权限
4.当用户打开订单界面,加载工具栏时,判断当前用户是否有销售订单新增的Operation,确定此按钮是否渲染
上文已经得出结论:操作(Operation) = 资源(ResourceNode)+ 操作类型(OperationType)
权限控制接口
判断当前用户是否有一个操作权限时的接口如下:
![](http://images0.cnblogs.com/blog/490358/201502/282105493467291.png)
权限控制接口调用
调用的场景一般都与插件有关,主要的场景有:
下面是工具栏(ToolbarItem)加载的权限控制
![](http://images0.cnblogs.com/blog/490358/201502/282106005183112.png)
目前熊猫下有四种插件项目与此类似,将来还会有更多
![](http://images0.cnblogs.com/blog/490358/201502/282106280026147.png)
三)页面级授权
页面级授权指的是,用户打开一个页面(一般一个URL唯一标识一个页面),没有权限则跳转到授权失败页面。页面授权有如下几种场景:
1.熊猫工作区页面
2.熊猫自定义的页面(HtmlPage子类)
3.普通JSP页面
页面的权限的控制一般在Serverlet的Listener拦截实现,在Spring.MVC中也可以拦截,在Listener中如果是非授权页面需要和授权页面区别出来,而且要有一套配置,熊猫不采用这种方式
从另一个角度说,页面权限控制的方式和工具栏的控制相似,只是控制的场景不同。
![](http://images0.cnblogs.com/blog/490358/201502/282107108142503.png)
四) 字段权限
字段权限的设置对客户来说和功能权限是一样的,字段权限是功能权限的一种延伸,请看如下关系图:
![](http://images0.cnblogs.com/blog/490358/201502/282107537525884.png)
字段权限的设置如下图:
(暂无)
场景描述:
1.客户打开列表或者表单
2.FormPart或者ListPart加载元数据
3.找到当前用户的权限数据,根据实体名和字段确定用户可以查看改字段,如果不能查看,那么该字段不渲染
权限字段的控制:
![](http://images0.cnblogs.com/blog/490358/201502/282108576741123.png)
列表渲染或者表单渲染的代码(以列表为例):
![](http://images0.cnblogs.com/blog/490358/201502/282109062361172.png)
五) 数据权限
(暂无)
六)工作流审批权限
暂无
作者 :秋时
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。