Devise - ¿Cómo prohíbo a ciertos usuarios iniciar sesión?

105

Estoy usando Devise para la autenticación en mi aplicación.

¿Cómo prohíbo a ciertos usuarios iniciar sesión? ¿Cómo deshabilitar a un usuario?

Dimitar Vouldjeff
fuente
42
Esta es una pregunta válida y debería ser reabierta - OP pregunta "¿Cómo prohíbo a ciertos usuarios iniciar sesión?" Usando devise .
Zabba

Respuestas:

149

Hazlo asi:

Cree una columna llamada is_activepara el Usermodelo.

Luego agregue el siguiente código al Usermodelo:

class User < ActiveRecord::Base
  #this method is called by devise to check for "active" state of the model
  def active_for_authentication?
    #remember to call the super
    #then put our own check to determine "active" state using 
    #our own "is_active" column
    super and self.is_active?
  end
end

ACTUALIZAR

Como señala Matt Huggins, el método ahora se llama active_for_authentication?( Documentación )

Zabba
fuente
21
Parece que se ha cambiado el nombre de esto en active_for_authentication?lugar de solo active?.
Matt Huggins
1
the method is now called active_for_authentication?significa que el nombre de su método debe ser en active_for_authentication?lugar de active?.
fotanus
Nota importante: ¡ active_for_authentication?tiene que ser un método público!
Mladen Jablanović
super and self.is_active?se puede simplificar asuper && is_active?
David
17

Agregue una columna al Usermodelo:allowed_to_log_in .

Luego agregue esto a /app/models/user.rb:

def active_for_authentication?
    super and self.allowed_to_log_in?
end

Si desea informar al usuario con un mensaje personalizado, también puede agregar esto:

def inactive_message
    "You are not allowed to log in."
end

Creo que es bastante importante porque el mensaje estándar de Devise dice:

"Tu cuenta aún no está activada."

Eso es confuso para los usuarios y la verdadera razón es que les ha "prohibido" iniciar sesión.

Oyvkva
fuente
Estoy implementando una función de suspensión de usuarios que funciona, sin embargo, el inactive_message "Su cuenta está actualmente suspendida" también se muestra para los registros de usuarios. ¿Puedo tener diferentes mensajes inactivos para la activación de una cuenta nueva y la suspensión del usuario?
Dercni
Gracias por el comentario inactive_message.
Chris Farmer
0

Quiere hacer una autorización, no una autenticación. Sin embargo, Devise solo hace autenticación.
Es decir, devise solo te dice que un usuario es quien dice ser.
Necesita algo más para prohibirle el uso del sitio.

La autorización es un tema popular y hay una lista completa de gemas que pueden ayudarte:
http://ruby-toolbox.com/categories/rails_authorization.html
Haz tu elección.

x10
fuente
6
Yo conozco la diferencia. Lo que pasa es que quiero prohibirle al usuario que inicie sesión, que no acceda a cierto controlador.
Dimitar Vouldjeff