Фильтрация пользователей, которые могут войти с помощью Devise - PullRequest
7 голосов
/ 10 ноября 2010

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

Существует ли простой способ расширить поиск аутентификации Devise , чтобы он не включал пользователей из удаленных дилеров? Возможно, использование именованной области действия для пользователя?

Приветствия

Тристан

Ответы [ 2 ]

15 голосов
/ 15 декабря 2010

Оказывается, все, что мне нужно было сделать, это переопределить метод find_for_authentication моей модели пользователя:

class User < ActiveRecord::Base
  ...

  # Intercept Devise to check if DealershipUser's Dealership is active
  def self.find_for_authentication(conditions)
    user = super
    return nil if user.is_a?(DealershipUser) && user.dealership.deleted?
    user
  end

  ...
end
  1. Найдите пользователя обычным способом, позвонив в super.
  2. Я использую STI, поэтому проверяю, является ли пользователь DealershipUser, а затем проверяю, удален ли дилерский центр (acts_as_paranoid).
  3. Вернуть пользователя.

Это очень специфическое решение для моего сценария, но вы можете переопределить find_for_authentication, если захотите, если впоследствии вернете пользователя.

4 голосов
/ 14 декабря 2010

Поиск Stackoverflow.com дал мне этот вопрос / ответ: Настраиваемая стратегия аутентификации для devise

По сути, вы должны реализовать настраиваемую стратегию аутентификации на уровне Warden (что лежит в основе Devise).Для своего проекта я сделал следующее:

In config/initializers/devise.rb:

Devise.setup do |config|
  config.warden do |manager|
    manager.default_strategies(:scope => :user).unshift :user_has_login_access
  end
end

Warden::Strategies.add(:user_has_login_access) do
  def valid?
    # pass the commit parameter as 'login' or something like that, so that this strategy only activates when the user is trying to login
    params[:commit] == 'login' 
  end

  def authenticate!
    u = User.find_by_email(params[:user][:email])
    if u.can_login? # retrieves boolean value stored in the User model, set wherever
      success! u
    else
      fail! "Account does not have login privilages."
    end
  end
end

Подробнее о пользовательских стратегиях Warden можно прочитать здесь: https://github.com/hassox/warden/wiki/Strategies

Надеюсь, чтопомогает!

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