当前位置: 首页 > 知识库问答 >
问题:

MongoDB节点JS基于角色的访问控制(RBAC)

毛成济
2023-03-14

我目前正在学习MEAN堆栈,开发一个简单的TODO应用程序,并希望为此实现基于角色的访问控制(RBAC)。我怎么设置角色

我想要3个角色(角色可能看起来很有趣,但这纯粹是为了学习):

  • 上帝
  • 超级英雄

GOD-类似于超级管理员,可以在应用程序中做任何事情。C, R, U, D权限适用于TODO和其他用户。可以创建一个TODO

超级英雄——类似于管理员,有超能力在他的个人数据上做任何事情——对于TODO来说。无法创建任何用户。只能阅读

男人-只能阅读并添加注释到分配给他/她的TODO。

总而言之:

上帝-C,R,U,D[全球级别]超级英雄-C,R,U,D[私人]R,U[分配给他]男人-R,U[分配给他]

我知道我需要有用户

共有3个答案

尉迟哲瀚
2023-03-14

可能的方法-

{
    _id : "email@mail.com",
    name: "lorem ipsum",
    role: "MAN"
}

正如你的帖子所描述的,只有上帝才能创造和分配托多。角色集合可能包含以下内容:

{
    _id : "MAN",
    globalPerm: [],
    privatePerm: [],
    assignedPerm: ["r","u"],
},
{
    _id : "SUPER_HERO",
    globalPerm: [],
    privatePerm: ["c","r","u","d"],
    assignedPerm: ["c","r","u","d"],
},
{
    _id : "GOD",
    globalPerm: ["c","r","u","d"],
    privatePerm: ["c","r","u","d"],
    assignedPerm: ["c","r","u","d"],
}

节点JS中间件在获得用户的正确权限值后,您可能想要使用中间件。示例快速HTTP请求路由:

app.post('/updateTodo', permissions.check('privatePerm', 'c'), function (req, res) {
 // do stuff

};

在实际执行函数体之前调用permissions.check来更新TODO。

因此,如果用户试图更新一个todo,它将首先验证相应的权限。

仇迪
2023-03-14

这是一个非常广泛的问题,可以通过多种方式解决。

您已经添加了您使用的是MEAN stack,因此我的问题仅限于此。

在整个问题中,您没有包括的一件事是您使用的是什么样的身份验证体系结构。假设您正在使用基于令牌的身份验证,现在人们通常使用它。

我们有3类用户。您也可以使用不同的选项来区分令牌的类型。

>

  • 不同的集合(mongoDB)或Redis集,它们将存储在那里
  • 加密令牌将具有用户类型等。(这将派上用场,如果你不需要在后端存储令牌,你可以只解密和检查)

    • 它将完全取决于用例

    现在,在允许任何用户进入用户特定的路由之前,请确保首先检查令牌。

    示例

    app.post('/godlevelroute', godtokencheck, callrouteandfunction);
    app.post('/superherolevelroute', superheroroute, callrouteandfunction);
    

    您必须从angular向标头中发送令牌,然后您可以从标头中取出数据,然后您可以检查该特定用户是否具有通过该路由的权限。

    假设一个god级别的用户登录后,他将随身携带godleveltoken,在允许他访问该路由之前,我们将首先进行检查,否则您可以显示错误消息。

    这可以是服务器端上的示例令牌检查html" target="_blank">功能

    function checkToken(req, res, next) {
    var token = req.headers['accesstoken']; //access token from header
    //now depending upon which system you are following you can run a check
    };
    

    节点模块建议:https://www.npmjs.com/package/jsonwebtoken

    现在进入前端部分。您正在使用angular,根据您所写的内容,您可以在显示任何页面之前截取令牌。

    你可以通过这个博客得到我试图解释的图片。点击这里

  • 潘宸
    2023-03-14

    我喜欢给角色起名字上帝超级英雄

    由于您正在使用MEAN堆栈,并且许多路由验证发生在节点上,我更喜欢保持角色表简单。

    角色:

    {
    _id : 1,
    name : GOD,
    golbalPerms : true
    },
    {
    _id : 2,
    name : SUPER HERO,
    privatePerms : true
    },
    {
    _id : 3,
    name : MAN
    }
    

    用户

    {
    _id : 111,
    name : Jesus,
    roleId : 1
    },
    {
    _id : 222,
    name : BatMan,
    roleId : 2
    },
    {
    _id : 333,
    name : Jack,
    roleId : 3
    }
    

    当用户登录并将user对象发送回客户端时,请确保将roleId替换为数据库中相应的role对象。

    来看看节点JS上的代码:

    通过完全理解您的用例,我们可以将它们分为以下方法-

    >

  • CreateUser

    创建

    删除TODO

    自述

    评论

    转让

    让我们一步一步走,CreateUser。

    路由代码段:

    app.all('/users', users.requiresLogin);
    
    // Users Routes
    app.route('/users')
        .post(users.hasPerms('globalPerms'), users.create);
    

    在您的控制器中,您可以基于输入进行验证,如果已验证,则允许通过调用next()elsereturn创建用户,并显示相应的错误消息。

    现在创建TODO

    他们两人几乎都用一个小技巧在相同的逻辑上工作。

    路由代码段:

    app.all('/todos', users.requiresLogin);
    
    // Users Routes
    app.route('/todos')
        .post(users.hasPerms('globalPerms','privatePerms'), todos.create);
        .delete(users.hasPerms('globalPerms','privatePerms'), todos.delete);
    

    对于创建一个Todo,globalPerms与上帝同在

    这里的技巧将在todos.delete方法中,只需确保user.id===todos.createById否则SUPER HERO可能会继续删除GOD创建的Todos。

    阅读待办事项:

    当一个TODO被创建时,它应该有一个createById存储同样当一个TODO被分配给某人时,那么assignedToassignedBy也应该被记录。

    这使得许多其他操作易于处理。

    用户。角色全球术语——把托多的所有数据都交给上帝。

    用户。角色privatePerms-提供由他/她创建或分配给他/她的TODO。

    user.role.globalPerms

    更新

    这完全是ReadTODO做DIY的复制品

    最后一个,分配TODO:

    简单的一个,loggedInUser。id==待办事项。createdById然后他可以将其分配给任何人。

    这里要记住两件事:

    >

  • 由于分配部分主要发生在你的UI(Angular)前面,我已经给出了检查loggedInUser.id==todos.createdById的方法。以任何方式登录的用户将通过读取操作查看所有TODO,并可以将其分配给任何他/她喜欢的人。

    确保一个超级英雄只能给他自己或其他超级英雄分配任务,或者给一个人分配任务,而不能给上帝。如何在UI前端显示分配给选项超出了这个问题的范围。这只是一个提醒。

    希望这是清楚的。

    注意:没有必要为角色集合中的人员授予权限

  •  类似资料:
    • 问题内容: 是否可以使用任何基于角色的开源访问控制系统? 问题答案: 布兰登·萨维奇(Brandon Savage)在他的PHP软件包“ ApplicationACL ” 上做了一个演示,该演示可能会或可能不会完成基于角色的访问。PHPGACL可能也能正常工作,但是我不能肯定地告诉您。 但是,我可以告诉您的是Zend Framework 的Zend_ACL组件将执行基于角色的设置(但是您必须子类化

    • 角色定义 [role_definition] 是RBAC角色继承关系的定义。 Casbin 支持 RBAC 系统的多个实例, 例如, 用户可以具有角色及其继承关系, 资源也可以具有角色及其继承关系。 这两个 RBAC 系统不会互相干扰。 此部分是可选的。 如果在模型中不使用 RBAC 角色, 则省略此部分。 [role_definition] g = _, _ g2 = _, _ 上述角色定义表

    • 以下内容是 xingzhou 对 kubernetes 官方文档的翻译,原文地址 https://k8smeetup.github.io/docs/admin/authorization/rbac/ 基于角色的访问控制(Role-Based Access Control, 即”RBAC”)使用”rbac.authorization.k8s.io” API Group实现授权决策,允许管理员通过Ku

    • 一个更友好的域内基于角色的访问控制的API。 这个API是Management API的子集。 RBAC用户可以使用这个API来简化代码。 参考 全局变量 e 是 Enforcer 实例。GoNode.jsPHP.NETRust e, err := NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv") const

    • 我已经开发了应用程序在Node.js.我使用序列化MSSQL和我已经创建了API的我正在消耗API的角。 我想知道的是关于安全性的事情:我已经实现了JWT的身份验证。现在我想实现角色权限管理我的要求是: 一个用户可以有多个角色(管理员、管理员) 角色可以具有多个权限(创建、更新等) 因此,一个用户可以拥有一个或多个角色,一个角色可以拥有一个或多个权限。权限类似于创建记录、删除记录等。用户可以访问他

    • 我正在开发一个mean stack web应用程序,它包含基于登录用户角色的差异访问。有几个不同的角色,如管理员,政府,志愿者等。 1.如何基于角色管理前端? 目前,我正在为每个角色设置全局标志,如isAdmin、is志愿者、isGovt等,并根据其值,使用 这是正确的说法吗。如果不是,请建议处理UI的正确方法。 2.如果用户没有授权,如何管理后端和重定向路由? 目前我正在尝试使用angular权