Как уже упоминалось ранее, я являюсь главным архитектором Апострофа на Пунк-авеню.
Коллекция 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 }
передается вставить, потому что я предполагаю, что вы хотите, чтобы это произошло в этот момент, независимо от того, кто запускает его.
Я рекомендую reading this tutorial on Apostrophe's model layer, чтобы получить прочное заземление в том, как работать с типами контента 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();
});
Надежда это полезно!
Спасибо. Это определенно полезно. Если я понимаю ваше предложение, я бы добавил self.AddUser для создания в моем модуле lib \ modules \ apostrophe-users. Затем я хочу вызвать этот метод из проверки, которую я выполняю в модуле apostrophe-express: 'middleware: [ function (req, res, next) { const email = // from cookie const auth = // from cookie if (email && auth) { // как я могу вызвать addUser здесь? //apostrophe-users.addUser(req, email, '', 'admin', null) } } ' Не знаете, как вызвать? –
Глядя на другой ответ, который вы указали в автоответчике (модуль демо-аутологи), вы используете метод self.pageBeforeSend. Я думал, что это будет выполняться только по совпадающим маршрутам, но похоже, что это выполняется по каждому запросу благодаря модулю, определенному в app.js. По моему мнению, этот метод self.pageBeforeSend может использоваться для выполнения любого кода, который я хочу использовать для любого запроса страницы, - доступа к объектам запроса и апоса.Если это не способ выполнить код для каждого запроса, можете ли вы указать мне лучший подход? –
Если вы добавите этот метод к apostrophe-users/index.js, как вы предлагаете, вы должны вызвать его так же из функции промежуточного программного обеспечения в другом модуле: return self.apos.users.addUser (req, имя пользователя, пароль, groupname, function (err, newUser) { if (err) { // Обращайтесь с ошибкой так, как вы считаете нужным, один из способов - это запрещенный ответ 403 res.statusCode = 403; return res.send ('forbidden') } // newUser - новый пользователь. Вы можете зарегистрировать их и перенаправить, // с кодом, который я вам предоставил в другом месте, или продолжить запрос: return next(); }); –