Как реализовать роли пользователя в nodejs passportjs - PullRequest
0 голосов
/ 02 апреля 2019

Как реализовать авторизацию / контроль доступа на основе ролей в nodejs с использованием expressjs и паспорта, а также как идеально спроектировать промежуточное ПО ролей?

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

что лучше, создать две модели и роутер на имя администратора и пользователя?

1. Проверка пользователя isAdmin или нет

2

// To authtenticate the User by JWT Startegy
module.exports = (userType, passport) => {
    let opts = {};
    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
    opts.secretOrKey = config.secret;
    passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
        if (userType == 'admin') {
            Admin.getAdminById(jwt_payload.data._id, (err, user) => {
                if (err) return done(err, false);
                if (user) return done(null, user);
                return done(null, false);
            });
        }
        if (userType == 'users') {
            User.getUserById(jwt_payload.data._id, (err, user) => {
                if (err) return done(err, false);
                if (user) return done(null, user);
                return done(null, false);
            });
        }
    }));
}

1 Ответ

0 голосов
/ 02 апреля 2019

Почему вы хотите иметь 2 места для получения пользовательских данных?

Иметь пользователей и назначать им роли.

Самая простая система контроля доступа: гостевая, вошедшая в систему, администратор.

Итак, в таблицу users добавьте столбец role со значениями: user, admin.

А теперь вы пишете промежуточное ПО:

const isLogged = function (req, res, next) {
   if (req.user)
     return next ();
   res.send ('unauth')
}
const isAdmin = function (req, res, next) {
   if (req.user.role == 'admin')
     return next ();
   res.send ('only admin')
}

И использование:

app.get('/', (req, res)=>{})
app.get('/profile',isLogged, (req, res)=>{})
app.get('/admin',isLogged, isAdmin, (req, res)=>{})

Для более сложных задач попробуйте найти некоторые модули ACL

...