2010-11-10 20 views
7

Tengo una aplicación Rails que utiliza Devise para la autenticación. Los usuarios pertenecen a Distribuidores y quiero evitar que los usuarios que pertenecen a los concesionarios con discapacidad de ser capaz de iniciar sesión.Filtrado de usuarios que pueden iniciar sesión con Devise

¿Hay una manera sencilla de extender buscador de autenticación del Legado por lo que no va a incluir a usuarios de distribuidores eliminados? Tal vez usando un alcance con nombre en el usuario?

Saludos

Tristán

Respuesta

15

Resulta que todo lo que tenía que hacer era reemplazar el método find_for_authentication de mi modelo de usuario:

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. encuentran la facilidad de la manera normal llamando al súper.
  2. Estoy usando STI, así que compruebo que el usuario es un concesionario y luego verifico si el concesionario ha sido eliminado (acts_as_paranoid).
  3. Devuelva el usuario.

Esta es una solución muy específica para mi caso, pero podría anular find_for_authentication como prefiera siempre que devuelva al usuario después.

+2

A mediados de 2013, y esto todavía funciona. –

4

búsqueda Stackoverflow.com me dieron esta pregunta/respuesta: Custom authentication strategy for devise

Básicamente, usted tiene que poner en práctica una estrategia de autenticación personalizado a nivel de Warden (que subyace Idear). Para mi proyecto, hice lo siguiente:

En 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 

Puede leer más sobre las estrategias Warden personalizados aquí: https://github.com/hassox/warden/wiki/Strategies

espero que ayude!

+0

Resulta que podría anular find_for_authentication (ver a continuación). Sin embargo, gracias por su respuesta, puede haber arrojado algo de luz sobre otro problema por el que estoy trabajando. – tristanm

Cuestiones relacionadas