【问题标题】:Defining a security model with implicit permissions / role定义具有隐式权限/角色的安全模型
【发布时间】:2016-12-25 23:14:42
【问题描述】:

我正在为我的网络应用程序开发角色/权限系统,但我不确定如何构建它。

简单地说。用户可以访问多个项目。这是一个参与,除其他外,一个参与具有一个具有多项权利的配置文件。因此,这些是项目中特定于用户的权利。参与也有一个类型(管理员、支持等)。

配置文件基于角色。角色(可能命名不当)实际上是标准配置文件,具有管理员预先定义的默认权限配置。创建新配置文件时,选择一个角色作为基础,然后,如果需要,可以调整权限。个人资料并非专属于一位用户。

到目前为止,一切都很好(或者不是!你告诉我!)

权利按上下文/主题分组。因此,例如,与“项目任务”有关的所有权利都归为一组。我没有对此建模,因为它是由 UI 处理的(不确定这是否是一件坏事)。

现在我的问题如下。根据参与类型,某些权利是隐含的,不应被禁用。因此,在为“支持”参与创建角色时,“查看我自己的支持票证”权利应该是隐含的,并且要么不显示,要么显示为禁用,因此无法更改。而不同的参与类型可以选择分配或不分配此权利。

我基本上有一个电子表格,其中参与者类型 / 正确 = 不能应用、可以应用(选择与否)和始终应用。例如:

| RIGHT              | INV | SUP | ADM |
| ------------------ | --- | --- | --- |
| G_PROJECTS_READ    |  I  |  I  |  Y  | 
| G_PROJECTS_UPDATE  |  Y  |  N  |  Y  |
| G_PROJECTS_CREATE  |  N  |  N  |  Y  |
| G_PROJECTS_PUBLISH |  N  |  N  |  Y  |

Where Y = Type can toggle right on/off, N = Type doesn't have right 
& I = Implied i.e. Type has right and it can't be deselected

关于如何建模的任何想法/指针?

非常感谢,

【问题讨论】:

  • 您是否考虑过通过在电子表格中创建所有可能的“参与角色”来消除模型的复杂性,从而消除对第三种“类型”权限建模的需要?负责将参与分配给用户的任何人都可以简单地选择适当的角色,而不是可能不得不即时设置(并且可能会犯错误)。因此,对于您的示例电子表格,最多有两个可能的选择(忽略管理员角色),您可以将其与参与类型联系起来:PARTICIPATION_READ_ONLYPARTICIPATION_READ_UPDATE

标签: java design-patterns permissions roles shiro


【解决方案1】:

角色基本上是预定义的配置文件。因此,各种角色将只是应用程序初始化期间创建的配置文件的实例。我们不需要 Role 作为单独的类/实体。

创建一个interface IProfile,它具有Set<Right> getAllRights()Set<Right> getEditableRights()Set<Right> getAllowedRights() 方法。方法getAllowedRights() 提供属于此配置文件的任何用户都具有的默认权限(这些权限无法修改)。方法getEditableRights() 显示管理员在创建新角色时可以编辑哪些权限。

现在来到Profile,它由Type组成并实现IProfile。现在您可以将 Profile 实现为

public class Profile implements IProfile {
    //fields have their getters as well
    Set<Right> allRights; 
    Type participantType;
    Set<Right> allowedRights;

    public Profile(Set<Right> allRights, Type participantType) {
        //Set values in fields here
    }

    //This is used by UI to show admins which Rights can be altered for creating a new Role.
    public Set<Right> getEditableRights() {
        getAllRights - participantType.getRights
    }
    public Set<Right> setAllowedRights(Set<Right> addedRights) {
        //addedRights here is a subset of Rights given by getEditableRights()
        this.allowedRights = participantType.getRights + addedRights;
    }

}

Minus 表示 Set 差分运算,Plus 表示 Set Union。

Type 的默认权限未在getEditableRights() 中给出,但它们用于设置setAllowedRights(Set&lt;Right&gt; addedRights) 中的总 allowedRights

为什么我创建了IProfile

如果您想创建由多个其他类组成的不同类型的Profile,当您将拥有Type 并说Reputation(声誉也会为用户提供一组固定的权限),然后你可以用不同的方式实现IProfile,而你依赖于IProfile的代码仍然以同样的方式工作。

【讨论】:

  • 谢谢,我会调查的。仍然不太确定如何存储类型/权限对应关系(静态地在代码枚举、数据库等中)。我更新了问题以包含提到的对应表的示例。还开始研究 Apache Shiro 作为一个潜在的框架来利用......
猜你喜欢
  • 2013-09-03
  • 2010-10-26
  • 2015-10-28
  • 1970-01-01
  • 2011-09-09
  • 2011-12-15
  • 2011-05-24
  • 1970-01-01
相关资源
最近更新 更多