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


78

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

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

我们是否将安全性纳入每条路线的实施中?问题在于我们在请求之间会有一些重复的逻辑。我们可以将其移到辅助函数中,但是仍然需要记住调用它。

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

Answers:


134

每条路线都可以正常使用。这通常是我要做的:

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个角色可以访问路由怎么办?
弗拉基米尔·朱基奇(Fladimir Djukic)

1
您可以requireRole代替数组吗?并检查indexOf
莱纳斯·泰尔

您可以添加示例吗?最后一条路由是否保护所有以/ foo / bar开头的路由?
弗拉基米尔·朱基奇(Fladimir Djukic)

如果在数据库上更改了权限怎么办?如何确保会话与数据库一致?
nomadoda '18

2
@nomadoda对我来说似乎是一个不同的问题,但是您必须以某种方式刷新会话。这取决于您使用的会话支持存储,最简单的方法是让用户在进行此类更改后再次登录。
莱纳斯·泰尔



3

现在有“节点”模块对此权限。它非常易于使用,非常类似于已接受的答案,但是仍然添加了一些功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.