web-dev-qa-db-fra.com

Modèle de sécurité des autorisations utilisateur Node.js + Express.js

Nous avons une application qui a deux types d'utilisateurs. Selon la façon dont l'utilisateur se connecte, nous voulons qu'il ait accès à différentes parties de l'application.

Comment implémenter un modèle de sécurité pour empêcher les utilisateurs de voir des choses auxquelles ils n'ont pas accès?

Faisons-nous partie de la sécurité de la mise en œuvre de chaque itinéraire? Le problème étant que nous aurons une logique en double entre les demandes. Nous pourrions déplacer cela dans des fonctions d'aide, mais nous aurions encore besoin de nous rappeler de l'appeler.

Faisons-nous partie de la sécurité d'un gestionnaire de route global app.all ()? Le problème étant que nous devons inspecter chaque itinéraire et faire une logique différente basée sur une multitude de règles. Au moins tout le code est au même endroit, mais alors ... tout le code est au même endroit.

78
Travis Parks

Le faire par itinéraire fonctionne généralement pour moi. C'est ce que je fais généralement:

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

Vous pouvez utiliser la capacité-js avec everyauth, ce qui est assez similaire à CanCan pour Rails https://github.com/scottkf/ability-js

8
Clément Renaud

Jetez un œil à cette liste pour les systèmes NodeJS ACL/Permission. IMHO OptimalBits node_acl semble le mieux.

7
McMeep

Il y a maintenant Node module permission pour cela. C'est très facile à utiliser, très similaire à la réponse acceptée, mais encore quelques fonctionnalités sont ajoutées.

3
Tommz