Проверьте, активен ли пользователь, прежде чем разрешить пользователю входить с помощью (рельсы)

Я использую devise и создал поле User, которое называется: active, которое является либо истинным, либо false. Я должен вручную активировать пользователя (true), прежде чем пользователь сможет войти в систему. По крайней мере, это намерение. Я пробовал это...

class SessionsController < Devise::SessionsController
  # POST /resource/sign_in
  def create
    "resource/signin CREATE"
    self.resource = warden.authenticate!(auth_options)
    unless resource.active?
      sign_out
      redirect_to :sorry_not_active_url
      return
    end
    set_flash_message(:notice, :signed_in) if is_navigational_format?
    sign_in(resource_name, resource)
    respond_with resource, :location => after_sign_in_path_for(resource)
  end  
end

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

Что было бы лучшим способом предотвратить вход пользователя, если пользователь не активен?

Спасибо.

Ответ 1

Добавьте эти два метода в свою модель пользователя, программа должна автоматически их подбирать - вам не нужно расширять Devise::SessionsController

def active_for_authentication?
  super && self.your_method_for_checking_active # i.e. super && self.is_active
end

def inactive_message
  "Sorry, this account has been deactivated."
end

Ответ 2

Devise (Если у вас есть приложение 3.2+), теперь поддерживайте block в (сеансе) create

# assuming this is your session controller

class SessionsController < Devise::SessionsController

def create
  super do |resource|
     unless resource.active?
      sign_out
      # you can set flash message as well.
      redirect_to :sorry_not_active_url
      return
    end
  end
end