zoukankan      html  css  js  c++  java
  • 读书札记:基于RBAC的权限设计模型权限API和权限的实现

     getPermissionByOrgGuid(String orgGuid )

      通过传入一个orgGuid拿到当前这个org对象都具有那些访问权限。

     

     getSourcePermissionByOrgGuid(String orgGuid , String resouceGuid)

       通过传入一个orgGuid一个资源的Guid返回改Org对当前这个资源的访问权限。

     

    getPermissionByResourceGuid(String resource)

       通过传入一个资源的Guid得到当前资源下都有那些权限定义。

     

    havingHeritPermission(String orgGuid , String resouceGuid) : Boolean

       传入一个orgGuid资源GUID,查看改OrgGuid下对资源是否有向下继承的权限。这里继承是资源的继承。即对父栏目有权限,可以继承下去对父栏目下的子栏目同样有权限。

     

    havingPermission(String orgGuid , String resourceGuid) : Boolean

       判断某Org对某一资源是否用权限。

     

    以上是粗粒度的权限API以下为细粒度的权限:

     

    getOperationByPermission(String permissionGuid)

       通过permissionGuid得到该permission的所有有效操作。

     

    getOperationByGuid(String permissionGuid , String resourceGuid)

       通过permisionGuid资源的Guid得到该资源下所有的有效操作。

     

    screeningOpreationByGuid (String permissionGuid , String resourceGuid , String orgGuid)

       通过permissionresourceorgGuid得到改Org对这一资源的有效操作。

     

    hasOperation(String operationGuid) : boolean

       通过传入的operationGuid返回是否具有操作权限。

     

    权限的实现

     

    1.表单式认证,这是常用的,但用户到达一个不被授权访问的资源时,Web容器就发

    出一个html页面,要求输入用户名和密码。

     

    2.用Filter防止用户访问一些未被授权的资源,Filter会截取所有Request/Response

    然后放置一个验证通过的标识在用户的Session中,然后Filter每次依靠这个标识来决定是否放行Response

     

    这个模式分为:

    Gatekeeper:采取Filter或统一Servlet的方式。

    Authenticator:在Web中使用JAAS自己来实现。

     

    Filter拦截只是拦截该用户是否有访问这个页面,或这一资源的权限。真正做到显示后拦截是在应用程序内部去做。

    做显示拦截提供API标签这两种方式。

    角色访问控制(RBAC)引入了Role的概念,目的是为了隔离User(即动作主体,Subject)Privilege(权限,表示对Resource的一个操作,即Operation Resource)
    Role
    作为一个用户(User)与权限(Privilege)的代理层,解耦了权限和用户的关系,所有的授权应该给予Role而不是直接给UserGroupPrivilege是权限颗粒,由OperationResource组成,表示对Resource的一个Operation。例如,对于新闻的删除操作。Role-Privilegemany-to-many的关系,这就是权限的核心。
    基于角色的访问控制方法(RBAC)的显著的两大特征是:1.由于角色/权限之间的变化比角色/用户关系之间的变化相对要慢得多,减小了授权治理的复杂性,降低治理开销。2.灵活地支持企业的安全策略,并对企业的变化有很大的伸缩性。
    RBAC
    基本概念:
    RBAC
    认为权限授权实际上是WhoWhatHow的问题。在RBAC模型中,whowhathow构成了访问权限三元组,也就是“WhoWhat(Which)进行How的操作
    Who
    :权限的拥用者或主体(如PrincipalUserGroupRoleActor等等)
    What
    :权限针对的对象或资源(ResourceClass)。
    How
    :具体的权限(Privilege,正向授权与负向授权)。
    Operator
    :操作。表明对WhatHow操作。也就是Privilege Resource
    Role
    :角色,一定数量的权限的集合。权限分配的单位与载体,目的是隔离UserPrivilege的逻辑关系.
    Group
    :用户组,权限分配的单位与载体。权限不考虑分配给特定的用户而给组。组可以包括组(以实现权限的继续),也可以包含用户,组内用户继续组的权限。UserGroup是多对多的关系。Group可以层次化,以满足不同层级权限控制的要求。
    RBAC
    的关注点在于RoleUser, Permission的关系。称为User assignment(UA)Permission assignment(PA).关系的左右两边都是Many-to-Many关系。就是user可以有多个rolerole可以包括多个user
    凡是用过RDBMS都知道,n:m 的关系需要一个中间表来保存两个表的关系。这UAPA就相当于中间表。事实上,整个RBAC都是基于关系模型。
    Session
    RBAC中是比较隐晦的一个元素。标准上说:每个Session是一个映射,一个用户到多个role的映射。当一个用户激活他所有角色的一个子集的时候,建立一个session。每个Session和单个的user关联,并且每个User可以关联到一或多个Session.
    RBAC系统中,User实际上是在扮演角色(Role),可以用Actor来取代User,这个想法来自于Business Modeling With UML一书Actor-Role模式。考虑到多人可以有相同权限,RBAC引入了Group的概念。Group同样也看作是Actor。而User的概念就具象到一个人。
    这里的GroupGBACGroup-Based Access Control)中的Group(组)不同。GBAC多用于操作系统中。其中的Group直接和权限相关联,实际上RBAC也借鉴了一些GBAC的概念。
    Group
    User都和组织机构有关,但不是组织机构。二者在概念上是不同的。组织机构是物理存在的公司结构的抽象模型,包括部门,人,职位等等,而权限模型是对抽象概念描述。组织结构一般用Martin fowlerParty或责任模式来建模。
    Party
    模式中的PersonUser的关系,是每个Person可以对应到一个User,但可能不是所有的User都有对应的PersonParty中的部门Department或组织Organization,都可以对应到Group。反之Group未必对应一个实际的机构。例如,可以有副经理这个Group,这是多人有相同职责。
    引入Group这个概念,除了用来解决多人相同角色问题外,还用以解决组织机构的另一种授权问题:例如,A部门的新闻我希望所有的A部门的人都能看。有了这样一个A部门对应的Group,就可直接授权给这个Group
    Role
    作为一个用户(User)与权限(Privilege)的代理层,解耦了权限和用户的关系,所有的授权应该给予Role而不是直接给UserGroupPrivilege是权限颗粒,由OperationResource组成,表示对Resource的一个Operation。例如,对于新闻的删除操作。Role-Privilegemany-to-many的关系,这就是权限的核心。
    基于角色的访问控制方法(RBAC)的显著的两大特征是:1.由于角色/权限之间的变化比角色/用户关系之间的变化相对要慢得多,减小了授权治理的复杂性,降低治理开销。2.灵活地支持企业的安全策略,并对企业的变化有很大的伸缩性。

  • 相关阅读:
    Python之路【第十六篇】:冒泡排序、斐波那契数列、用户登陆程序
    Python之路【第十五篇】:文件操作
    Python之路【第十四篇】:Python的内置函数
    Python之路【第十三篇】:isinstance()函数与lambda表达式及函数参数的传递方式
    Python之路【第十二篇】:函数
    Python之路【第十一篇】:三目运算、不同数据类型的存储方式及深浅拷贝(copy模块)、列表推导式
    Python之路【第十篇】:索引与切片的不同
    Python之路【第九篇】:字符串与字节的相互转换以及2.7与3输出方式的不同
    Python之路【第八篇】:enumerate、range与xrange
    scala学习之类和对象
  • 原文地址:https://www.cnblogs.com/Gemgin/p/3136310.html
Copyright © 2011-2022 走看看