#meteor #temporary #meteor-useraccounts
#meteor #временный #meteor-учетные записи пользователей
Вопрос:
Я разрабатываю простое приложение, используя Meteor, чтобы изучить фреймворк. Я использую accounts-password
пакет, который включает в accounts-base
себя пакет.
Пользователь создаст учетную запись, и его адрес электронной почты будет использоваться в качестве имени пользователя для входа в систему. Все это отлично работает, как и предполагалось. Теперь я хочу перейти на следующий уровень.
Я хочу иметь возможность временно запретить пользователя на временно установленный период времени — скажем, на неделю.
Возможна ли эта функциональность с помощью accounts-password
пакета или существует другой пакет, который будет выполнять эту функциональность? В противном случае, как я могу реализовать эту функциональность самостоятельно?
Ответ №1:
Как насчет использования чего-то вроде флага isBanned в коллекции users для каждого пользователя? Таким образом, вы проверяете наличие этого флага перед входом пользователя в систему. Вы могли бы дополнительно расширить это, указав поле даты, когда был применен запрет, а позже иметь способ рассчитать прошедшее время, чтобы узнать, может ли запрет быть автоматически снят.
db.users.findOne()
{
[...]
"username" : "superadmin",
"profile" : {
"isActive" : true,
"createdBy" : "system",
// is this user banned?
"isBanned" : false,
"updatedAt" : ISODate("2016-10-07T17:33:42.773Z"),
"loginTime" : ISODate("2016-10-07T17:25:44.068Z"),
"logoutTime" : ISODate("2016-10-07T17:33:42.660Z")
},
"roles" : [
"superAdmin"
]
}
Ваши события формы входа могут быть такими:
Template.loginForm.events({
'submit #login-form': function(event,template){
event.preventDefault();
// Check for isBanned flag
if(Meteor.users.find({username: template.find("#userName").value,isBanned: false}) {
Meteor.loginWithPassword(
template.find("#userName").value,
template.find("#password").value,
function(error) {
if (error) {
// Display the login error to the user however you want
console.log("Error logging in. Error is: " error);
Session.set('loginErrorMessage', error.message);
Router.go('/');
}
}
);
Meteor.call('updateLoginTime');
Router.go('loggedIn');
},
}
Комментарии:
1. Мне нравится эта идея, хотя флаг, вероятно, не должен находиться внутри поля профиля, потому что он доступен для редактирования на стороне клиента пользователя.
2. @BarryMichaelDoyle — Любопытно, но как? Я также довольно новичок в meteor и, следовательно, не знаю всей полноты такой дыры в безопасности.
3. Вы можете прочитать все об этом здесь, в официальных документах: guide.meteor.com/accounts.html#dont-use-profile
4. Спасибо за это. После прочтения списка соответствующих ссылок, относящихся к этому, я уверен, что нахожусь в центре внимания разработчиков noob meteor. Возвращаясь к теме, (а) запретить обновление в Meteor.пользователи (б) ведение отдельной коллекции с данными профиля пользователя не помогает?
5. Дело в том, что если вы проверяете это только на стороне клиента, знающий пользователь может легко переопределить его. Это должно быть применено на стороне сервера. Вы можете либо запретить пользователю входить в систему, либо разрешить вход в систему и ограничить активность. Идеи см. в разделе validateLoginAttempt.