2016-12-19 5 views
0

У меня есть две пользовательские коллекции в моем db, и я хочу сделать разные типы входа для каждого, поэтому я сделал две стратегии для паспорта для своего сайта («local -user '&' local-manager '). Мой вопрос: как проверить зарегистрированный пользовательский тип (по используемой стратегии) ​​в моем приложении?проверить, зарегистрирован ли пользователь в паспорте Стратегия (разные типы пользователей)

В этом коде паспорт просто проверяет подлинность пользователя, но я хочу проверить по стратегии. (Например: если пользователь регистрируется в системе по «местным-менеджером», а затем показать страницу)

function isLoggedIn(req, res, next){ 
    if (req.isAuthenticated()) { 
     next(); 
     return; 
    } 
    res.redirect('/login');  
} 
+0

Зачем вам создавать 2 пользовательские коллекции для 2-х типов пользователей? Как насчет 1 пользовательской коллекции с полем 'type'? – willie17

+0

мои пользователи настолько сложны, и я не могу сделать их одной коллекцией, не так ли проверять такую ​​стратегию? –

+1

Да, нет такой вещи, как проверка по стратегии. Я рекомендую реструктурировать вашу модель. Например, коллекция 'User' с полями' username', 'password',' type', 'NormalUser' со всей информацией« обычного пользователя »со ссылкой на' User', 'Manager' сбор ... Что-то нравится. – willie17

ответ

0

Это лучше использовать отображение роли для этого.

Во всяком случае сейчас вы можете использовать эту концепцию:

var passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy; 

passport.use(new LocalStrategy(
    {passReqToCallback: true}, 
    function(req, username, password, done) { 
    req.usedStrategy = 'local-user'; 
    //do auth stuff 
    }); 
    } 
)); 

И использовать так:

function isLoggedIn(req, res, next){ 
    if (req.isAuthenticated() && req.usedStrategy === 'local-user') { 
     next(); 
     return; 
    } 
    res.redirect('/login'); 

} 

Также вы можете использовать сессию, если вы включите его в passport.

+0

кажется отличным кодом и решением, но в функции isLoggedIn он дает неопределенное значение ... –

+0

Как я могу сохранить его на сессии паспорта? –

+0

@pouya Пожалуйста, проверьте это: https://github.com/jmimi/express-4.x-local-example –

0

Должно быть сказано (и было в других ответах/комментариях), что вы действительно должны снова взглянуть на свое моделирование домена. Пользовательские объекты могут быть очень простыми (только информация для входа), а остальные могут быть разбиты на другие модели/схемы.

Во всяком случае на ответ на исходный вопрос:

Вы можете переключиться на тип пользователя. Паспорт не заходит слишком далеко в остальную часть вашего приложения. Стратегии входа в систему неизвестны не за пределами фактического раздела журнала.

Вы можете обращаться с этим в качестве промежуточного слоя и добавить некоторую дополнительную информацию для объекта запроса путем проверки уникального имущества в одной из моделей:

function(request, response, next){ 
    request.isManager = !!(request.user && request.user['unique_prop']); 
    next(); 
} 

Поместите это после Идентов промежуточного слоя. Затем на вашем маршруте вы можете переключиться на request.isManager. Также инкапсуляция этого в промежуточном программном обеспечении будет абстрагировать его от пользовательской модели и позволить вам реорганизовать его в фоновом режиме.

Другой альтернативой было бы добавить функцию в качестве static/method/virtual (в зависимости от реализации) к схеме, если вы используете мангуст.

Надеюсь, это поможет. Если у вас есть дополнительные вопросы, не стесняйтесь добавлять комментарии, и я могу изменить ответ.

Смежные вопросы