Rails + Devise - Есть ли способ запретить пользователю, чтобы он не мог войти или сбросить свой пароль? - PullRequest
32 голосов
/ 12 апреля 2011

У меня много пользователей благодаря устройству, и я хочу забанить нескольких проблемников. Есть ли в Devise встроенная поддержка?

Спасибо

Ответы [ 4 ]

84 голосов
/ 31 августа 2011

Из документа devise для authenticatable.rb :

Перед аутентификацией пользователя и в каждом запросе Devise проверяет, активна ли ваша модель, вызывая model.active_for_authentication?Этот метод перезаписывается другими модулями разработки.Например: подтверждаемые перезаписывают .active_for_authentication?возвращать true только если ваша модель была подтверждена.

Вы переписываете этот метод самостоятельно, но если это так, не забудьте вызвать super:

def active_for_authentication?
  super && special_condition_is_valid?
end

Итак, когдау вас есть флаг blocked в пользовательской базе данных, метод в пользовательской модели выглядит примерно так:

def active_for_authentication?
  super && !self.blocked
end
30 голосов
/ 12 апреля 2011

Я только что реализовал это в своем проекте сам. То, что я сделал, было похоже на Kleber выше, я определил это в своем app / controllers / session_controller.rb (переопределяя Devise) ...

class SessionsController < Devise::SessionsController

protected

  def after_sign_in_path_for(resource)
    if resource.is_a?(User) && resource.banned?
      sign_out resource
      flash[:error] = "This account has been suspended for violation of...."
      root_path
    else
      super
    end
   end

end

А затем я добавил логический столбец для пользователей с именем «banned», чтобы модераторы установили флажок при редактировании пользователя в бэкэнде, и логическое значение вернет true.

Но был один недостаток ... если пользователь уже вошел в систему, а затем забанен, у него все еще был доступ к выполнению каких-либо действий на сайте (комментарии и т. Д.) По крайней мере до истечения срока их сеанса или до выхода из системы. Поэтому я сделал это в app / controllers / application_controller.rb ...

class ApplicationController < ActionController::Base
  before_filter :banned?

  def banned?
    if current_user.present? && current_user.banned?
      sign_out current_user
      flash[:error] = "This account has been suspended...."
      root_path
    end
  end
end

Это автоматически выведет их из системы, если будет обнаружен бан. В любом случае, не уверен, что все это «лучший» способ учесть все это, так как я новичок в Rails, но все это работает для меня и надеюсь, что оно по крайней мере даст вам хороший старт.

1 голос
/ 13 февраля 2019

Настройка проверки статуса учетной записи пользователя при входе в систему

Иногда вы хотите добавить настраиваемую проверку пользователя перед входом в систему. В этом случае мне нужно было реализовать account_active boolean (trueили ложно) проверить.Так что если это правда, это позволит пользователю войти в систему и создать сеанс, если false, то будет отображаться ошибка «учетная запись не активна».

Перезаписать active_for_authentication?метод в вашей модели (пользователь) и добавьте свою логику проверки.Вы хотите вернуть super && (true или false)

  def active_for_authentication?
    # Uncomment the below debug statement to view the properties of the returned self model values.
    # logger.debug self.to_yaml

    super && account_active?
  end

В этом случае он проверяет логическое значение на account_active и возвращает его значение методу входа, который его вызвал.

Оригинальная active_for_authentication?Метод можно найти в devise / lib / devise / models / authenticatable.rb.

Примечание: active_for_authentication?вызывается Devise после аутентификации пользователя и в каждом следующем запросе.Это значит, какой код вы добавляете в переопределение active_for_authentication?будет выполняться для каждого запроса во время сеанса пользователя.

Примечание: active_for_authentication?не вызывается для каждого запроса при использовании database_authenticatable.Он вызывается только при входе в систему.Не уверен, что это предполагаемое поведение.

Настроить сообщение об ошибке

Если метод 'active_for_authentication?'возвращает false, метод 'inactive_message' вызывается, пользователь получит уведомление за неактивность.Нам нужно также настроить сообщение:

  def inactive_message
    account_active? ? super : :account_inactive
  end

Теперь это будет ссылаться на пользовательское сообщение для «account_inactive», а не «inactive», которое нам нужно определить в файле перевода devise.

 devise:
     failure:
       inactive: 'Your account was not activated yet.'
       account_inactive: 'Your account is not active.'
     registrations:
       signed_up_but_account_inactive: "Thanks for signing up. We'll let you know when your account is active"
0 голосов
/ 12 апреля 2011

Вы можете добавить поле с именем "banned" в таблицу пользователей.

и затем на вашем контроллере вы можете получить что-то вроде этого:

class UsersController < ApplicationController
before_filter :deny_banned

protected
def deny_banned
  if current_user.banned?
    redirect_to root_path, :notice => "You are banned from this site."
  end
end

end

Это не завершено, но я надеюсь, что это поможет вам как-то.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...