2010-10-08 12 views
13

Estoy usando Devise para la autenticación en mi aplicación de rieles y me gustaría poder bloquear ciertas cuentas y evitar que los usuarios vuelvan a registrarse con un correo electrónico bloqueado. Simplemente no estoy seguro de cuál es la mejor manera de hacerlo.¿Cuál es la mejor manera de prohibir/bloquear usuarios con Devise for Rails?

Mi primer pensamiento fue anular las sesiones y los controladores de registro para verificar el modelo de un usuario con un bit bloqueado, pero tengo la sensación de que podría haber una manera más elegante.

Respuesta

11

lo haría así:

def after_sign_in_path_for(resource) 
    if resource.is_a?(User) && resource.banned? 
    sign_out resource 
    banned_user_path 
    else 
    super 
    end 
end 
+2

Tenga en cuenta que esto tiene una debilidad: si un usuario está prohibido mientras ya están conectados, la prohibición no tendrá efecto hasta que se desconecten y vuelvan a iniciar sesión (lo que podría ser un tiempo prolongado). el usuario para desconectarse en el momento en que los prohíbe, o mover esta lógica a un 'before_action' en sus controladores en lugar de usar' after_sign_in_path_for'. – GMA

+1

cuando prohíbe al usuario, simplemente agregue una línea más para cerrar sesión – enter08

0

Se puede crear un custom validation method en el modelo de usuario, que, en crear, comprueba si el correo electrónico está en la lista de correos electrónicos bloqueados.

2

Un enfoque más elegante es anular el método find_for_authentication del controlador (Usuario), analizándolo solo para usuarios desbloqueados. De esta forma, intentar iniciar sesión como un usuario bloqueado es como intentar iniciar sesión como un usuario que no existe. (Si desea indicar al usuario que está bloqueado, se puede establecer una alerta de destello aquí también Here's a good run-through

5

Una mejor solución es reemplazar el active_for_authentication método en el modelo legado (Usuario), así:..?.

def active_for_authentication? 
     super && !self.banned? 
    end 
20

El mejor enfoque es hacerlo en forma Diseñar:.

siguiente se supone que está utilizando Idear módulo database_authenticable y los nombres de los usuarios modelo de usuario de la aplicación

1. Implemente un account_active? método.

Agregue la columna booleana account_active en la tabla de usuarios o defina el método account_active? en el modelo de usuario (puede elegir su propio nombre de método). Por ejemplo:

# app/models/user.rb 
    def account_active? 
     blocked_at.nil? 
    end 

2. sobrescribir el método active_for_authentication? en su modelo (Usuario).

# app/models/user.rb 
    def active_for_authentication? 
     super && account_active? 
    end 

3. método Add que devuelve la traducción de mensajes flash.

Cuando active_for_authentication? devuelve falso, Devise pregunta por qué su modelo está inactivo utilizando el método inactive_message.

# app/models/user.rb 
    def inactive_message 
     account_active? ? super : :locked 
    end 

Y eso es todo. No necesita preocuparse por sign_out o redirect_to usuario.

Por otra parte, el usuario está bloqueado de inmediato, con la siguiente petición, no después de señal siguiente en el

Más:. devise/authenticatable.rb.

+0

¿Podría decir qué es cada archivo para cada bloque de código? –

+1

@AymanSalah hecho según lo solicitado. Los tres métodos se deben ubicar en 'app/models/user.rb' (suponiendo que user.rb es su modelo responsable de los usuarios de la aplicación) – sampi

+0

Muchas gracias mi hombre. Tu respuesta fue realmente útil. –

Cuestiones relacionadas