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

Rails + Devise - есть ли способ BAN для пользователя, чтобы они не могли войти в систему или reset их пароль?

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

Спасибо

4b9b3361

Ответ 1

Я только что реализовал это в своем проекте. То, что я делал, было похоже на Kleber выше, я определил это в своем приложении/контроллерах/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.

Но был один изъян... если пользователь уже был зарегистрирован и затем заблокирован, у них все еще был доступ к тому, чтобы делать вещи на сайте (комментарии и т.д.) по крайней мере до истечения срока их сеанса или выхода из системы. Поэтому я сделал это в приложении /controller/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, но все это работает для меня и надеюсь, что это по крайней мере даст вам хорошее начало.

Ответ 2

Из проекта doku для authenticatable.rb:

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

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

def active_for_authentication?
  super && special_condition_is_valid?
end

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

def active_for_authentication?
  super && !self.blocked
end

Ответ 3

В таблицу "Пользователи" вы можете добавить поле "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

Это не полно, но я надеюсь, что это вам поможет.