2010-11-10 2 views
7

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

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

Приветствия

Тристан

ответ

15

Оказывается, все, что мне нужно сделать, это переопределить метод 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. Найти пользователя в обычном порядке по телефону супер.
  2. Я использую STI, поэтому я проверяю, что пользователь является DealershipUser, а затем проверьте, удалено ли дилерское управление (act_as_paranoid).
  3. Верните пользователя.

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

+2

Середина 2013 года, и это все еще работает. –

4

Поиск stackoverflow.com дал мне этот вопрос/ответ: Custom authentication strategy for devise

В принципе, вы должны реализовать пользовательскую стратегию проверки подлинности на уровне Стражницы (который лежит в основе Завещание). Для моего проекта, я сделал следующее:

В 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 

Вы можете прочитать больше о пользовательских стратегий Стражей здесь: https://github.com/hassox/warden/wiki/Strategies

Надежда, что помогает!

+0

Оказывается, я могу переопределить find_for_authentication (см. Ниже). Спасибо за ваш ответ, хотя, возможно, он пролил свет на другую проблему, над которой я работаю. – tristanm

Смежные вопросы