Объясните новичку Mean.io, как работает аутентификация в примере пакета Mean.io.

Я изучаю 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"?


person randwa1k    schedule 18.08.2014    source источник
comment
Что касается exports, то это часть модульной системы Node. Всякий раз, когда вы require что-то делаете, вы получаете объект exports из нужного вам файла.   -  person ivarni    schedule 18.08.2014
comment
Для вопроса A см. it" title="какова цель экспорта модуля js узла и как вы его используете"> stackoverflow.com/questions/5311334/   -  person Steve Jansen    schedule 23.10.2014


Ответы (1)


ПО ВОПРОСУ А (об использовании exports)

В Node.js присвоение значений объекту exports делает эти значения доступными для кода, который require использует исходный файл.

Например, для данного файла foo.js:

exports.foo = "FOO";
exports.bar = "BAR";

и файл main.js:

var foo = require('foo.js');
console.log('foo=',foo.foo,'; bar=',foo.bar);

запуск node main.js выведет foo= FOO ; bar= BAR.

См., например, документацию модуля Node или это описание require и exports.

ОТНОСИТЕЛЬНО ВОПРОСА B (на упаковке "связывание")

Ответ на этот вопрос является дополнением к ответу на вопрос А.

Есть код для "связывания" пакетов. Это оператор require.

В вашем исходном коде app.js первая строка (чтение var mean = require('meanio')) установит локальную переменную mean в любое значение, присвоенное объекту exports при загрузке модуля meanio.js и/или meanio.

То же самое с passport = require('passport'). В этом случае локальная переменная passport будет равна значению exports после index.js в модуле паспорта загружается.

ПО ВОПРОСУ С

Я не совсем уверен, что вы здесь спрашиваете, но позвольте мне попробовать.

В таком случае:

1) var mean = require('meanio') в строке 1 «импортирует» модуль meanio, так что локальная переменная mean более или менее установлена ​​равной значению exports в модуле meanio.

2) Module = mean.Module в строке 2 устанавливает локальную переменную Module равной значению mean.Module, которое должно быть присвоено в модуле meanio.

3) var Access = new Module('access') создает экземпляр класса Module, присваивая его локальной переменной Access.

4) Access.passport = passport назначает переменную экземпляра с именем passport в экземпляре meanio.Module с именем Access (значение модуля passport required в строке № 3)

5) Access.middleware = auth присваивает переменной экземпляра с именем middleward в экземпляре meanio.Module с именем Access (значение, возвращаемое require('./server/config/authorization') в строке 11).

Я не знаком с модулем «meanio», но, судя по этому коду, похоже, что вы настраиваете экземпляр meanio.Module("access") (с именем Access), назначая определенные «магические» имена переменных.

Другими словами, вместо Access.passport = passport; Access.middleware = auth у вас может быть Access.setPassport(passport); Access.setMiddleware(auth) или (а не строка 5) var Access = new Module('access',passport,auth).

То есть автор модуля «meanio», похоже, решил использовать специальные имена переменных для настройки класса, а не методы или параметры «установщика», передаваемые конструктору. Я предполагаю, что где-то в коде meanio вы найдете ссылку на что-то вроде this.middleware и this.passport, где предполагается, что вы «заполнили» эти переменные экземпляра, как это происходит в последних нескольких строках вашего примера кода.

Если бы вы добавили Access.auth = auth, то все, что произошло бы, это то, что объект Access получил бы новый атрибут с именем auth, чье значение равно значению локальной переменной auth.

Если вы использовали Access.auth вместо из Access.middleware, я предполагаю, что любой код в классе Access, использующий this.middleware, потерпит неудачу, поскольку Access.middleware никогда не присваивалось значение, а Access.auth не является таковым. «магических» имен переменных, которые ищет meanio.

person Lela Jennings    schedule 03.06.2016