Как создать динамические политики в Sailes.js

Я работаю над проектом, в котором мне нужно создавать и назначать политики в соответствии с правами/уровнями доступа для пользователя в Sailes.js

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

В настоящее время в парусах все политики хранятся в

API/политики

папке и назначаются контроллеру в

конфиг/policies.js

module.exports.policies = {

UserController: {
    "create": ['canCreate'],
    "list": ['canRead'],
    "show": ['canRead'],
},
AuthController: {
    '*': true,
}};

Мой вопрос: как я могу создавать динамические политики на основе уровней доступа, поступающих из БД?

Я погуглил, но ничего не нашел о том, как создавать динамические политики в Sailes.js, поэтому публикую здесь.

Благодарим вас за помощь в этом.

Спасибо


person Adarsh Nahar    schedule 21.04.2015    source источник


Ответы (4)


Ознакомьтесь с sails-permissions.

Комплексная система разрешений и прав пользователей для Sailes.js и Waterline. Поддерживает аутентификацию пользователей с помощьюpassword.js, разрешения на основе ролей, владение объектами и безопасность на уровне строк.

person Travis Webb    schedule 21.04.2015
comment
спасибо за ответ, могу ли я использовать его без паспорта.js? - person Adarsh Nahar; 21.04.2015
comment
Я не уверен, почему вы не хотите использовать паспорт, но вы можете отключить его, если хотите. Вам просто нужно написать свой собственный логин. - person Travis Webb; 21.04.2015
comment
о да, отказ от ответственности: я автор парусов-разрешений - person Travis Webb; 21.04.2015
comment
Спасибо, Трэвис, разрешения на паруса великолепны, я решил использовать их для создания ролей и политики. Спасибо за ваше время. - person Adarsh Nahar; 22.04.2015

Простым методом было бы создание политики для каждого уровня доступа.

policy/level01.js policy/level02.js и т.д. . .

ваш файл политики проверит их сеанс/токен, чтобы убедиться, что они соответствуют критериям этой политики.

политики/level01.js

module.exports = function(req,res,next){
 if(req.session.accessLevel = 1) return next();
 return res.forbidden();
}

Тогда в вашей конфигурации

module.exports.policies = {
UserController: {
    "create": ['policyXX.js'],
    "list": ['policyXX.js'],
    "show": ['policyXX.js'],
},
AuthController: {
    '*': true,
}};

Начните с чего-то подобного, чтобы ознакомиться с работой этих политик и наращивать их. Всегда очень важно знать и понимать, как именно работает ваша безопасность.

person Meeker    schedule 21.04.2015
comment
как мне вызвать политики в соответствии с уровнем в конфигурации, поскольку у каждого пользователя может быть разный уровень доступа? - person Adarsh Nahar; 21.04.2015
comment
вы вызываете политики, основанные на ограничении конечной точки. Таким образом, если UserController.create ограничен, например, уровнем 4, то в приведенном выше примере вы поместите ['policy04.js'] в действие создания, а затем проверьте policy04.js, чтобы убедиться, что они действительно находятся на уровне 4. - person Meeker; 21.04.2015

Решение @Travis Webb хорошее. Вы также можете создавать роли модели и разрешение модели, связанные отношениями (один ко многим, многие ко многим ....) по своему желанию, а затем фильтровать их с помощью такой политики:

Пример:

module.exports = function isAdmin (req, res, next) {
    if (typeof req.session.User != "undefined") {
    User.findOne(req.session.User.id).populate('roles').exec(function(err,user){
           if(err) return res.forbidden('You are not permitted to perform this action.');
           if(!user) return res.redirect('/user/new');
           for(var i in user.roles){
                if(user.roles[i]['name'] == 'ROLE_ADMIN'){
                    return next();
                }
           }
           return res.redirect('/user/show/'+req.session.User.id);
        });
    } else {
        return res.redirect('/session/new');
    }
};

Наилучшие пожелания

person Mehdi Aïssani    schedule 21.04.2015

Полтора года спустя, если кто-то столкнется с этим, sails-must выглядит как хорошее решение для этого.

RabbitController: {
    nurture: must().be.a('rabbit').mother,
    feed: [must().be.nice.to('rabbits'), must().have('rabbit').food]
},

Отказ от ответственности: я не использовал его сам.

person Tomer Cagan    schedule 22.02.2017