web-dev-qa-db-ja.com

Node.js + Express.jsユーザー権限セキュリティモデル

2つのタイプのユーザーを持つアプリケーションがあります。ユーザーのログイン方法に応じて、アプリケーションのさまざまな部分にアクセスできるようにします。

ユーザーがアクセスできないものを見ることを防ぐためのセキュリティモデルをどのように実装しますか?

セキュリティを各ルート実装の一部にしますか?問題は、リクエスト全体でロジックが重複することです。これをヘルパー関数に移動することもできますが、それを呼び出すことを忘れないでください。

セキュリティをグローバルapp.all()ルートハンドラの一部にしますか?問題は、各ルートを検査し、多数のルールに基づいて異なるロジックを実行する必要があることです。少なくともすべてのコードは1か所にありますが、...すべてのコードは1か所にあります。

78
Travis Parks

ルートごとにそれを持っていることは、通常私にとってはうまくいきます。これは私が通常行うことです:

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

Every-authでcapability-jsを使用できます。これはRails https://github.com/scottkf/ability-js のCanCanと非常によく似ています

8
Clément Renaud

NodeJS ACL/Permissionシステムの このリスト をご覧ください。私見 OptimalBits node_acl が最適です。

7
McMeep

現在、Node module permission があります。これは非常に使いやすく、受け入れられている回答と非常に似ていますが、いくつかの機能が追加されています。

3
Tommz