2015-11-24 2 views
0

У меня есть небольшая дилемма, чтобы решить эту проблему.Маршрутизация Expressjs: Ролевые маршруты

У меня есть пользователь и роль администратора.

userRoles: ['user', 'admin'] 

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

Первое решение я имею в виду, чтобы проверить роли на уровне контроллера:

if (req.user.role == 'admin'){list all users} 
else{list all except admins} 

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

router.get('/', auth.hasRole('user'), controller.index); 
router.get('/', auth.hasRole('admin'), controller.getUsers); 


function hasRole(roleRequired) { 
if (!roleRequired) throw new Error('Required role needs to be set'); 

    return compose() 
    .use(isAuthenticated()) 
    .use(function meetsRequirements(req, res, next) { 
     if (config.userRoles.indexOf(req.user.role) >= config.userRoles.indexOf(roleRequired)) { 
     next(); 
     } 
     else { 
     res.status(403).send('Forbidden'); 
     } 
    }); 
} 

любые предложения? Спасибо!

+0

Я не уверен, что я понимаю, каков ваш вопрос. Вы используете опциональный второй параметр, так я справился с проверкой подлинности для своей игры. Что-то не так? –

+0

на основе маршрута перечислены только пользователи, даже если они зарегистрированы в качестве администратора. – Mo7

ответ

0

Итак, я не уверен, что это ваша проблема, но одна вещь, которую следует помнить, заключается в том, что JS не гарантирует индексацию массива (по спецификации ecmascript), поэтому ваш тест >= не является надежным.

Лучше использовать битовую маску, как я сделал в AuthZ, где вы назначаете права или роли в качестве основных двоичных чисел, которые затем можно фильтровать по:

// lib/rights.js 
module.exports = { 
    READ : 1 << 0, // 001 
    WRITE : 1 << 1, // 010 
    DELETE : 1 << 2 //100 
}; 

// lib/roles.js 
var rights = require('./rights'); 
    module.exports = { 
     ADMIN : rights.READ^rights.WRITE^rights.DELETE, 
     MEMBER : rights.READ^rights.WRITE, 
     GUEST : rights.READ 
    }; 

Затем вы можете проверить довольно легко:

if (user.role & resource.rightsRequired) { /* you're in! */ } 
Смежные вопросы