node.js - Verificar acceso/grupo en Passport.js
(1)
Podría crear un middleware simple que verifique el grupo:
var needsGroup = function(group) {
return function(req, res, next) {
if (req.user && req.user.group === group)
next();
else
res.send(401, ''Unauthorized'');
};
};
app.get(''/api/users'',
passport.authenticate(''local''),
needsGroup(''admin''),
function(req, res) {
...
});
Esto supone que el objeto almacenado en req.user
tiene un group
propiedades. Este objeto es el que se pasa desde la implementación de la estrategia y deserializeUser
.
Una alternativa podría ser connect-roles , pero no sé qué tan bien se integra con Passport.
EDITAR: también puede combinar Passport y el middleware de comprobación de grupo:
var needsGroup = function(group) {
return [
passport.authenticate(''local''),
function(req, res, next) {
if (req.user && req.user.group === group)
next();
else
res.send(401, ''Unauthorized'');
}
];
};
app.get(''/api/users'', needsGroup(''admin''), function(req, res) {
});
Me gustaría usar passport.js para verificar que cuando los usuarios llegan a ciertos puntos finales no solo tienen la contraseña correcta, sino que también son miembros de un grupo específico o tienen un acceso determinado.
Por simplicidad, si tengo niveles de acceso de USER y ADMIN.
Puedo usar el pasaporte para autenticar una contraseña:
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: ''Incorrect username.'' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: ''Incorrect password.'' });
}
return done(null, user);
});
}
));
Luego, con una ruta puedo asegurarme de que el usuario pasa la autenticación:
app.get(''/api/users'',
passport.authenticate(''local''),
function(req, res) {
res.json({ ... });
});
Pero digamos que necesita tener acceso de ADMIN para golpear / api / users ''. ¿Necesito escribir mis propias estrategias? ¿Es necesario tener una estrategia de usuario local y de administrador local, y en cada una de ellas verificar los niveles de acceso adecuados?
Creo que puedo hacer esto con bastante facilidad, pero el problema surge cuando necesito que mi sitio tenga diferentes métodos de autenticación (tal vez a veces use Auth), necesitaría escribir * -user personalizado, * -admin estrategias para cada uno. Parece una exageración.
Otra opción es simplemente verificar el acceso / grupo en cada ruta después de que el usuario haya sido autenticado. Pero preferiría hacer esto en el middleware si es posible.
Gracias