【问题标题】:Node.js + Express.js User Permission Security ModelNode.js + Express.js 用户权限安全模型
【发布时间】:2012-03-25 10:39:25
【问题描述】:

我们的应用程序有两种类型的用户。根据用户的登录方式,我们希望他们能够访问应用程序的不同部分。

我们如何实施安全模型以防止用户看到他们无权访问的内容?

我们是否将安全性作为每个路由实施的一部分?问题是我们将在请求之间有一些重复的逻辑。我们可以将它移到辅助函数中,但我们仍然需要记住调用它。

我们是否将安全性作为全局 app.all() 路由处理程序的一部分?问题是我们必须检查每条路线并根据大量规则执行不同的逻辑。至少所有代码都在一个地方,但是……所有代码都在一个地方。

【问题讨论】:

    标签: security node.js express


    【解决方案1】:

    每条路线都有它通常对我有用。这是我通常做的:

    function requireRole (role) {
        return function (req, res, next) {
            if (req.session.user && req.session.user.role === role) {
                next();
            } else {
                res.send(403);
            }
        }
    }
    
    app.get("/foo", foo.index);
    app.get("/foo/:id", requireRole("user"), foo.show);
    app.post("/foo", requireRole("admin"), foo.create);
    
    // All bars are protected
    app.all("/foo/bar", requireRole("admin"));
    
    // All paths starting with "/foo/bar/" are protected
    app.all("/foo/bar/*", requireRole("user"));
    

    【讨论】:

    • 但是如果只有 2 个角色可以访问路由呢?
    • 你可以让requireRole 取一个数组吗?并与indexOf联系。
    • 您能添加示例吗?这最后一条路线是否保护所有以 /foo/bar 开头的路线?
    • 如果数据库的权限发生了变化怎么办?如何确保会话与数据库一致?
    • @nomadoda 这对我来说似乎有点不同,但你必须以某种方式刷新会话。这取决于您使用的会话支持存储,最简单的方法是让用户在这种类型的更改后再次登录。
    【解决方案2】:

    现在有 Node 模块 permission 用于此。它非常易于使用,与公认的答案非常相似,但仍添加了一些功能。

    【讨论】:

      【解决方案3】:

      查看this list 了解 NodeJS ACL/权限系统。恕我直言OptimalBits node_acl 看起来最好。

      【讨论】:

      • 是否有更新的 Node.js ACL 模块列表?我们正在考虑如何在 Meteor.js 应用中实现 ACL。
      【解决方案4】:

      你可以在everyauth中使用ability-js,这和CanCan for Rails很相似https://github.com/scottkf/ability-js

      【讨论】:

        猜你喜欢
        • 2011-05-24
        • 1970-01-01
        • 2011-10-02
        • 1970-01-01
        • 2014-08-08
        • 2015-01-09
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        相关资源
        最近更新 更多