3

MASA Auth - 权限设计

 2 years ago
source link: https://www.cnblogs.com/MASA/p/16304403.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
  • Subject:用户,用户组

  • Action:对Object的操作,如增删改查等

  • Object:权限作用的对象,也可以理解为资源

  • Effect:规则的作用,如允许,拒绝

  • Condition:生效条件

  • Permission:允许(拒绝)用户(用户组)在条件允许下对对象(资源)的动作

  • Role:权限集合,权限数量>=1

RBAC (Role-Based Access Control,基于角色的访问控制),引入了 Role(角色)的概念,并且将权限与角色进行关联。用户通过扮演某种角色,具有该角色的所有权限。

即权限,角色,用户之间的关系是多对多对多

RBAC0

用户和角色的关系是多对多

权限和角色的关系是多对多

RBAC1

RBAC2

  • 用户,角色,权限均可互斥。不允许存在任意冲突。

  • 角色分配次数受限,比如一个公司只有一个CEO

  • 先决条件角色

    权限赋予要从低到高。如:要先有XX副总权限才能获取XX总权限。

  • 静态职责分离(目前先支持静态职责分离)

    用户无法被赋予冲突的角色

  • 动态职责分离

    用户会话中无法激活冲突的角色

RBAC3

RBAC0 + RBAC1 + RBAC2

Attribute Based Access Control,基于属性的权限验证。允许更细粒度的控制X属性的Y资源在Z条件下进行A操作。相较于RBAC,会对开发人员提出更高的要求,目前我们先只介绍到RBAC。

我们通过预设博客文章场景来反推实现方式

用户角色

一篇文章要面对两种角色,即:读者,管理员

[{
    "Subject": "Avril",
    "Roles":["ArticleReader"]
}, {
    "Subject": "Dodd",
    "Roles":["ArticleManager"]
}]

角色

读者将获得读文章权限,管理员则获得管理文章权限

[
    {
        "Name": "ArticleReader",
        "Permissions": [
            "ReadArticle"
        ]
    }, {
        "Name": "ArticleManager",
        "Permissions": [
            "ManageArticle"
        ]
    }
]

权限

角色有了,依赖的权限也有了,接下来我们需要继续把权限明细确认一下

[
    {
        "Name": "ReadArticle",
        "Effect": "Allow",
        "Action": ["Read"],
        "Object": ["Article"]
    }, {
        "Name": "ManageArticle",
        "Effect": "Allow",
        "Action": ["Create", "Read", "Update", "Delete"],
        "Object": ["Article"]
    }
]

基于RBAC3的依赖模型

erd.png

简单的引入一个RBAC无法满足一个工程化的项目,比如批量操作,前后端集成等

单个用户的管理已经出来了,但日常中我们很少会对单个用户进行授权。更多的是针对一组(批)人进行操作。

team.png

到目前为止,我们设计的都还在后端。而前端关心的是页面展示相关的,比如菜单,页面元素等

这里要设计什么?或许可以偷个懒,在Objects里增加一个ObjectType用来区分菜单还是页面元素即可?

ObjectType被修改的可能性很小,所以我们将在SDK中提供枚举来支持

至此,我们把RBAC与用户管理的部分已经设计完了。或许它缺少了传统意义上的组织架构树,但它带来了更加松散的,扁平化的团队管理。

(本文章不代表最终设计)

MASA.BuildingBlocks:https://github.com/masastack/MASA.BuildingBlocks

MASA.Contrib:https://github.com/masastack/MASA.Contrib

MASA.Utils:https://github.com/masastack/MASA.Utils

MASA.EShop:https://github.com/masalabs/MASA.EShop

MASA.Blazor:https://github.com/BlazorComponent/MASA.Blazor

如果你对我们的 MASA Framework 感兴趣,无论是代码贡献、使用、提 Issue,欢迎联系我们

16373211753064.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK