Я изучаю mean.io на это обучающее видео, в котором показан пример пакета (созданный mean package mymodule
. Он также описан в разделе "Пакеты" на документы). Мне нужна помощь в понимании того, как работает данная аутентификация/авторизация.
Образец пакета/модуля по умолчанию имеет простую аутентификацию пользователя, которая на стороне клиента
myapp/packages/mymodule/public/views/index.html содержит:
<li>
<a href="mymodule/example/anyone">Server route that anyone can access</a>
</li>
<li>
<a href="mymodule/example/auth">Server route that requires authentication</a>
</li>
<li>
<a href="mymodule/example/admin">Server route that requires admin user</a>
</li>
На стороне сервера
myapp/packages/mymodule/server/routes/mymodule.js содержит:
// The Package is past automatically as first parameter
module.exports = function(Mymodule, app, auth, database) {
app.get('/mymodule/example/anyone', function(req, res, next) {
res.send('Anyone can access this');
});
app.get('/mymodule/example/auth', auth.requiresLogin, function(req, res, next) {
res.send('Only authenticated users can access this');
});
app.get('/mymodule/example/admin', auth.requiresAdmin, function(req, res, next) {
res.send('Only users with Admin role can access this');
});
...
};
Магия другой аутентификации зависит от второго аргумента app.get()
с дополнительным обратным вызовом аутентификации: нет, auth.requiresLogin
или auth.requiresAdmin
.
Это магия аутентификации (также на github< /а>):
myapp/packages/access/server/config/authorization.js:
/**
* Generic require login routing middleware
*/
exports.requiresLogin = function(req, res, next) {
if (!req.isAuthenticated()) {
return res.send(401, 'User is not authorized');
}
next();
};
/**
* Generic require Admin routing middleware
* Basic Role checking - future release with full permission system
*/
exports.requiresAdmin = function(req, res, next) {
if (!req.isAuthenticated() || !req.user.hasRole('admin')) {
return res.send(401, 'User is not authorized');
}
next();
};
ВОПРОС A. Почему в файле author.js указано «exports.requiresLogin» и «exports.requiresAdmin» вместо «somethingelse.requiresLogin» и «somethingelse.requiresAdmin»? Связан ли этот «экспорт» с exports
myapp/packages/access/server/config/passport.js: module.exports = function(passport) { ...}
, github? Если да, то при каких обстоятельствах мы можем использовать этот «экспорт»?
Поскольку правила авторизации аутентификации прописаны в пакете «access» и используются в пакете «mymodule», пакеты Mean.io не являются независимыми друг от друга. Пакет Access
зарегистрирован на
myapp/packages/access/app.js, github:
var mean = require('meanio'),
Module = mean.Module,
passport = require('passport');
var Access = new Module('access');
Access.register(function(database) {
// Register auth dependency
var auth = require('./server/config/authorization');
require('./server/config/passport')(passport);
// This is for backwards compatibility
mean.register('auth', function() {
return auth;
});
mean.register('passport', function() {
return passport;
});
Access.passport = passport;
Access.middleware = auth;
return Access;
});
ВОПРОС B: Mean.io автоматически связывает все пакеты или где-то есть код для связывания пакетов? Это связано из-за части с надписью «Это для обратной совместимости», показанной ниже? Если да, то где можно использовать «auth»? Все пакеты myapp/packages/? Как насчет базового каталога приложения mean.io myapp/?
var auth = require('./server/config/authorization');
// This is for backwards compatibility
mean.register('auth', function() {
return auth;
});
ВОПРОС C: Почему "Access.passport = паспорт;", но "промежуточное ПО" для "Access.middleware = auth;"? Что произойдет, если это будет "Access.auth = auth"?
exports
, то это часть модульной системы Node. Всякий раз, когда выrequire
что-то делаете, вы получаете объектexports
из нужного вам файла. - person ivarni   schedule 18.08.2014