Подтвердить что ты не робот

Каков наилучший способ заблокировать/заблокировать пользователей с помощью Devise for Rails?

Я использую Devise для аутентификации в моем приложении rails, и я хотел бы блокировать определенные аккаунты и не допускать перерегистрации пользователей с заблокированным электронным письмом. Я просто не знаю, как лучше всего это сделать.

Моя первая мысль заключалась в том, чтобы переопределить контроллеры сеансов и регистраций, чтобы проверить модель для пользователя с заблокированным битом, но у меня есть ощущение, что может быть более элегантный способ.

4b9b3361

Ответ 1

Я бы сделал это следующим образом:

def after_sign_in_path_for(resource)
  if resource.is_a?(User) && resource.banned?
    sign_out resource
    banned_user_path
  else
   super
  end
end

Ответ 2

Наилучший подход - сделать это разработкой:

Ниже предполагается, что вы используете модуль Devise database_authenticatable, а пользователи вашего приложения называют модели User.

1. Реализовать аккаунт_активно? Метод.

Добавьте логический столбец account_active в таблицу пользователей или определите метод account_active? в модели пользователя (вы можете выбрать собственное имя метода). Например:

    # app/models/user.rb
    def account_active?
      blocked_at.nil?
    end

2. Замените метод active_for_authentication? в вашей модели (пользователь).

    # app/models/user.rb
    def active_for_authentication?
      super && account_active?
    end

3. Добавьте метод, который возвращает перевод для флеш-сообщения.

Всякий раз, когда active_for_authentication? возвращает false, Devise спрашивает причину неактивности вашей модели, используя метод inactive_message.

    # app/models/user.rb 
    def inactive_message
      account_active? ? super : :locked
    end

И это все. Вам не нужно заботиться о пользователе sign_out или redirect_to.

Более того, пользователь блокируется немедленно, при следующем запросе, а не после следующего входа.

Подробнее: devise/authenticatable.rb.

Ответ 3

Лучшее решение - переопределить active_for_authentication? метод на модели разработки (Пользователь). Например:

    def active_for_authentication?
      super && !self.banned?
    end

Ответ 4

Более элегантный подход состоит в том, чтобы переопределить метод find_for_authentication (User) контроллера, показывая его только для разблокированных пользователей. Таким образом, попытка войти в систему как заблокированный пользователь - это попытка войти в систему как пользователь, которого не существует. (Если вы хотите сообщить пользователю, что она заблокирована, вы также можете установить флеш-предупреждение. Здесь хороший прогон.

Ответ 5

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