• 权限管理


    一、权限控制总论

    ----------------------------------------------------------------------------------------------

    权限控制可以归结为一句话:哪些对哪些资源做哪些操作
     
    哪些人一般有两种视角,一种是基于用户和系统,相关的关键字有:用户、角色、用户组等
    第二种是基于组织结构或者HR的视角,相关的关键字有:员工、岗位、职务、部门等
    熊猫采用第二种视角,在这种视角下,员工、岗位、职务、部门统一称之为“授权主体(AuthorizationPrincipal)”,授权主体可以拥有权限,最终都体现在员工上,目前可以对岗位和部门进行授权,组织结构是树状关系,下级组织结构的权限自动继承上级组织结构的权限
     
    哪些资源有广义的资源和狭义的资源,广义的资源指的是企业管理一切要管理的事物,讨论没有意义。狭义的资源指的是产品中进行权限控制的界面和业务数据等,在Panda中资源就是ResourceNode对应的领域对象。更多ResourceNode的资料请参见Netsharp总体介绍1.3.3节
     
    哪些操作也有广义和狭义的概念,在Panda中操作主要分成三种,功能权限、数据权限、字段权限。功能权限主要控制一个按钮能不能操作,一个页面能不能打开;数据权限可以理解为行级别的权限,即多条记录中你可以看哪部分,常见的数据权限是基于组织机构的;字段权限可以理解为数据库列权限,即一些敏感的字段你能不能看,比如客户手机号和销售金额。
    字段权限是特殊的功能权限,甚至某些数据权限也可以认为是特殊的功能权限,功能权限请查看如下场景:
    这个表分成内容、列头、行头三个部分,内容称之为"操作(Operation)"列头称之为"资源(ResourceNode)",行头称之为"操作类型(OperationType)",
    通过考察上表,可以得出如下结论:操作(Operation) = 资源(ResourceNode)+ 操作类型(OperationType)
     
    说明:权限控制还有一些高级的概念,比如权限互斥、分级授权、权限代理、多组织权限、项目管理等,panda暂时不做这些功能。
     
    二、权限管理静态结构
    ----------------------------------------------------------------------------------------------
     
    下面是权限管理的静态结构总图:
    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)
     
    权限控制接口
    判断当前用户是否有一个操作权限时的接口如下:
    权限控制接口调用
        调用的场景一般都与插件有关,主要的场景有:
        下面是工具栏(ToolbarItem)加载的权限控制
     目前熊猫下有四种插件项目与此类似,将来还会有更多
    三)页面级授权
    页面级授权指的是,用户打开一个页面(一般一个URL唯一标识一个页面),没有权限则跳转到授权失败页面。页面授权有如下几种场景:
    1.熊猫工作区页面
    2.熊猫自定义的页面(HtmlPage子类)
    3.普通JSP页面
     
    页面的权限的控制一般在Serverlet的Listener拦截实现,在Spring.MVC中也可以拦截,在Listener中如果是非授权页面需要和授权页面区别出来,而且要有一套配置,熊猫不采用这种方式
     
    从另一个角度说,页面权限控制的方式和工具栏的控制相似,只是控制的场景不同。
    四) 字段权限
     
    字段权限的设置对客户来说和功能权限是一样的,字段权限是功能权限的一种延伸,请看如下关系图:
     
    字段权限的设置如下图:
    (暂无)
     
    场景描述:
    1.客户打开列表或者表单
    2.FormPart或者ListPart加载元数据
    3.找到当前用户的权限数据,根据实体名和字段确定用户可以查看改字段,如果不能查看,那么该字段不渲染
    权限字段的控制:
     
    列表渲染或者表单渲染的代码(以列表为例):
    五) 数据权限
    (暂无)
    六)工作流审批权限
    暂无

    作者    :秋时

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

  • 相关阅读:
    php报错Warning: Use of undefined,开启或关闭display_errors
    easyui中dialog的使用
    easyUI布局panel面板
    git放弃本地,强制拉取远程
    友链
    CASIAWebMaskedFace 模拟佩戴口罩人脸数据集
    二叉树[先中后序 广度深度优先]
    TreePrint打印树结构工具类
    跨域设置
    和供应商开会2问题和改进
  • 原文地址:https://www.cnblogs.com/Netsharp/p/4306215.html
Copyright © 2020-2023  润新知