Автоматическое добавление пользователей в Апостроф

Я хотел бы расширить модуль (или создать свой собственный) для автоматического добавления пользователей в Apostrophe (коллекция aposUsersSafe).

Я не вижу встроенного метода в модуле apostrophe-users для этого и ищу некоторые рекомендации относительно того, как это можно реализовать? Спасибо!


person lance-p    schedule 03.10.2016    source источник


Ответы (1)


Как упоминалось ранее, я главный архитектор Апострофа на Пунк-авеню.

Коллекция aposUsersSafe предназначена для хранения хэшей паролей и денормализованных копий только нескольких тесно связанных свойств. Обычно вам никогда не нужно взаимодействовать с ним напрямую. Как и все другие документы в Apostrophe, пользователи живут в aposDocs коллекции. И лучше всего взаимодействовать с ними с помощью методов, предоставляемых модулем, который управляет этим типом элементов. В данном случае это будет apos.users (модуль apostrophe-users).

Оцените этот метод; это слегка переработано по сравнению с addFromTask методом apostrophe-users, который реализует добавление пользователей, а также добавляет их в группу, что вы почти наверняка захотите сделать.

Здесь нет кода для хеширования пароля, потому что insert метод apos.users сделает это за нас.

self.addUser = function(req, username, password, groupname, callback) {
  // find the group
  return self.apos.groups.find(req, { title: groupname }).permission(false).toObject(function(err, group) {
    if (err) {
      return callback(err);
    }
    if (!group) {
      return callback('That group does not exist.');
    }
    return self.apos.users.insert(req, {
      username: username,
      password: password,
      title: username,
      firstName: username,
      groupIds: [ group._id ]
    }, { permissions: false }, callback);
  });
};

permission(false) вызывается для курсора, и для вставки передается объект параметров с { permissions: false }, потому что я предполагаю, что вы хотите, чтобы это произошло в этот момент независимо от того, кто его запускает.

Я рекомендую прочитать это руководство по слою модели Apostrophe, чтобы получить прочную основу в как без проблем работать с типами контента Apostrophe. Вы можете использовать MongoDB напрямую, но вы должны знать, когда это делать, а когда нет.

Вы можете передать больше свойств при вставке пользователя; это всего лишь минимум для разумного поведения.

Что касается вызова метода, если бы вы добавили его в lib/modules/apostrophe-users/index.js на уровне проекта внутри construct, вы могли бы вызвать его так из промежуточного программного обеспечения:

return self.apos.users.addUser(req, username, password, groupname, function(err, newUser) {
  if (err) {
    // Handle the error as you see fit, one way is a 403 forbidden response
    res.statusCode = 403;
    return res.send('forbidden');
  }
  // newUser is the new user. You could log them in and redirect,
  // with code I gave you elsewhere, or continue request:
  return next();
});

Надеюсь, это будет полезно!

person Tom Boutell    schedule 03.10.2016
comment
Спасибо. Это определенно полезно. Если я понимаю ваше предложение, я бы добавил self.AddUser для построения в моем модуле lib \ modules \ apostrophe-users. Затем я хочу вызвать этот метод из проверки, которую я выполняю в моем модуле apostrophe-express: middleware: [ function(req, res, next) { const email = //from cookie const auth = //from cookie if(email && auth) { //how do I invoke addUser here? //apostrophe-users.addUser(req, email, '', 'admin', null) } } Не знаете, как вызвать? - person lance-p; 04.10.2016
comment
Взглянув на другой ответ, который вы предоставили для пользователей с автоматическим входом (модуль demo-autologin), вы используете метод self.pageBeforeSend. Я думал, что это будет выполняться только на совпадающих маршрутах, но похоже, что это выполняется для каждого запроса в силу того, что модуль определен в app.js. Насколько я понимаю, этот метод self.pageBeforeSend можно использовать для выполнения любого кода, который я хочу использовать для любого запроса страницы - имея доступ к объектам request и apos. Если это не способ выполнять код для каждого запроса, не могли бы вы указать мне лучший подход? - person lance-p; 04.10.2016
comment
Если вы добавите этот метод в apostrophe-users / index.js, как вы предлагаете, то вы бы вызывали его следующим образом из функции промежуточного программного обеспечения в другом модуле: return self.apos.users.addUser (req, имя пользователя, пароль, имя группы, функция (err, newUser) {if (err) {// Обработка ошибки по своему усмотрению, один из способов - запретить ответ 403 res.statusCode = 403; return res.send ('запрещено');} // newUser - это новый пользователь. Вы можете войти в систему и перенаправить // с кодом, который я дал вам в другом месте, или продолжить запрос: return next ();}); - person Tom Boutell; 05.10.2016