2010-11-10 8 views
7

Mam aplikację Rails używającą narzędzia Devise do uwierzytelniania. Użytkownicy należą do kupców i chcę, aby uniemożliwić użytkownikom, którzy należą do dealerów niepełnosprawnych od bycia w stanie zalogować się.Filtrowanie użytkowników, którzy są w stanie zalogować się przy pomocy narzędzia Devise

Czy istnieje prosty sposób przedłużyć opracować za uwierzytelniania Finder tak, że nie będzie zawierała użytkowników z usuniętych dealerów? Być może za pomocą nazwanego zakresu na użytkownika?

Cheers

Tristan

Odpowiedz

15

Okazuje się, że wszystko, co potrzebne do zrobienia było zastąpić metodę find_for_authentication mojego użytkownika modelu:

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. znaleźć użytkownika w normalny sposób poprzez wywołanie Super.
  2. Używam STI, więc sprawdzam, czy użytkownik jest DealershipUser, a następnie sprawdza, czy dealerskie zostało usunięte (acts_as_paranoid).
  3. Zwraca użytkownika.

Jest to bardzo specyficzne rozwiązanie dla mojego scenariusza, ale można zastąpić metodę find_for_authentication pod warunkiem, że później zwrócisz użytkownika.

+2

Połowa 2013 r. I to nadal działa. –

4

wyszukiwania stackoverflow.com dał mi na to pytanie/odpowiedź: Custom authentication strategy for devise

Zasadniczo trzeba wdrożyć strategię niestandardowego uwierzytelniania na poziomie naczelnika (które leży u podstaw opracować). Dla mojego projektu, zrobiłem co następuje:

W 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 

Możesz przeczytać więcej o niestandardowych strategii wardenowskich tutaj: https://github.com/hassox/warden/wiki/Strategies

nadzieję, że pomoże!

+0

Okazuje się, że mogę przesłonić find_for_authentication (patrz poniżej). Dzięki za odpowiedź, być może rzuciło to trochę światła na inny problem, nad którym pracuję. – tristanm

Powiązane problemy