2014-12-24 2 views
0

Мне нужно проверить статус пользователя перед каждым запросом api и вернуть 403, если это неактивный пользователь.Loopback 2.8: Проверить статус пользователя перед каждым запросом api

Я попытался выполнить проверку в подстановочных beforeRemote, но я должен зарегистрировать его для каждой модели, к которой я хочу ограничить доступ.

Также можно зарегистрировать специальное промежуточное ПО, но req.accessToken не существует к этому моменту.

Существуют ли более эффективные способы ограничения доступа пользователей?

ответ

0

В качестве опции вы можете попробовать ввести новую роль ACTIVE_USER и использовать ACL для управления доступом. Некоторые ссылки для документации: roles и access control concepts.

+0

Хорошее решение, но оно не работает для меня. После регистрации 'inactive' роли (подстановочный DENY) я проверяю вывод отладки, запустив' $ DEBUG = loopback: security: acl slc run'. Роль 'inactive' (со счетом 7511) перекрывается роль' $ owner' (со счетом 8016). Так вычисляется приоритет acl. – IvanZh

-1

Зарегистрировать роль резольвера. См. Мой пример здесь: https://github.com/strongloop/loopback-example-access-control/blob/master/server/boot/create-role-resolver.js

+0

Спасибо за ответ, но это не работает для меня, потому что другие решатели роли (например, $ owner) имеют более высокий вычисленный приоритет, чем новый. – IvanZh

+0

отклонение в ролиResolver приведет к 401 тоже. – stevejpurves

0

Как насчет использования простого промежуточного программного обеспечения для этого?

app.use(function checkIfUserIsActive(req, res, next) { 
if (!req.accessToken) { 
    // User not logged in 
    return next(); 
} 
app.models.UserModel.findById(req.accessToken.userId, function (err, user) { 
    if (err) { 
     // Error with finding the user 
     return next(err); 
    } 
    if (!user) { 
     return next(new Error('No user with this access token was found.')); 
    } 
    if (!user.active) { 
     return next(new Error('User is inactive.')); 
    } else { 
     return next(); 
    } 
}); 
});