Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security Node.js+;Express.js用户权限安全模型_Security_Node.js_Express - Fatal编程技术网

Security Node.js+;Express.js用户权限安全模型

Security Node.js+;Express.js用户权限安全模型,security,node.js,express,Security,Node.js,Express,我们有一个应用程序,它有两种类型的用户。根据用户登录的方式,我们希望他们能够访问应用程序的不同部分 我们如何实现一个安全模型来防止用户看到他们无权访问的东西 我们是否将安全性作为每个路线实施的一部分?问题是,我们会在请求之间有一些重复的逻辑。我们可以将其移动到helper函数中,但仍然需要记住调用它 我们是否将安全性作为全局app.all()路由处理程序的一部分?问题是,我们必须检查每条路线,并根据大量规则执行不同的逻辑。至少所有的代码都在一个地方,但是。。。所有代码都放在一个地方。每条路线都有

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

我们如何实现一个安全模型来防止用户看到他们无权访问的东西

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


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

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

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"));

您可以将ability js与everyauth一起使用,这与CanCan for Rails非常相似

看看NodeJS ACL/权限系统。IMHO看起来最好。

现在有了这个节点模块。它非常易于使用,与公认的答案非常相似,但仍然添加了一些功能。

是否有Node.js ACL模块的最新列表?我们正在考虑如何在Meteor.js应用程序中实现ACL。但如果只有两个角色可以访问route呢?您可以让
requireRole
使用数组代替?并使用
索引检查
。您可以添加示例吗?这最后一个路由是否保护所有以/foo/bar开头的路由?如果数据库上的权限发生更改怎么办?如何确保会话与数据库一致?@nomadoda对我来说,这似乎是一个不同的问题,但您必须以某种方式刷新会话。这取决于您使用的会话备份存储,最简单的方法是让用户在该类型更改后再次登录。