Как временно запретить пользователя в Meteor

#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.