ruby-on-rails - sign_in - rspec rails devise
Rails+Devise-¿Hay alguna forma de BANAR a un usuario para que no puedan iniciar sesión o restablecer su contraseña? (3)
Acabo de implementar esto en mi proyecto yo mismo. Lo que hice fue similar a Kleber, lo definí en mi aplicación / controladores / sessions_controller.rb (reemplazando a Devise) ...
class SessionsController < Devise::SessionsController
protected
def after_sign_in_path_for(resource)
if resource.is_a?(User) && resource.banned?
sign_out resource
flash[:error] = "This account has been suspended for violation of...."
root_path
else
super
end
end
end
Y luego agregué una columna booleana a los Usuarios llamada ''prohibido'', por lo que los moderadores marcan la casilla de verificación al editar el usuario en el backend, y el booleano devolverá verdadero.
Pero hubo un error ... si un usuario ya había iniciado sesión y luego se le había prohibido, todavía tenía acceso a hacer cosas en el sitio (comentarios, etc.) al menos hasta que su sesión expirara o se desconectara. Así que hice esto en la aplicación / controllers / application_controller.rb ...
class ApplicationController < ActionController::Base
before_filter :banned?
def banned?
if current_user.present? && current_user.banned?
sign_out current_user
flash[:error] = "This account has been suspended...."
root_path
end
end
end
Eso los desconectará automáticamente si se detecta una prohibición. De todos modos, no estoy seguro de que todo esto sea la "mejor" forma de tenerlo en cuenta ya que soy más nuevo en Rails, pero todo funciona para mí y espero que al menos te dé un buen comienzo.
Tengo muchos usuarios gracias al dispositivo y quiero prohibir algunos creadores de problemas. ¿Devise tiene este soporte incorporado?
Gracias
Desde el dispositivo doku para authenticatable.rb :
Antes de autenticar a un usuario y en cada solicitud, ¿Desea verificar si su modelo está activo llamando a model.active_for_authentication? Este método es sobrescrito por otros módulos de diseño. Por ejemplo,: confirmable sobrescribe .active_for_authentication? Solo devuelve verdadero si su modelo fue confirmado.
Usted sobrescribe este método usted mismo, pero si lo hace, no olvide llamar super:
def active_for_authentication?
super && special_condition_is_valid?
end
Por lo tanto, cuando tiene un indicador blocked
en la base de datos de usuarios, el método en el modelo de usuario se parece a esto:
def active_for_authentication?
super && !self.blocked
end
Podría agregar un campo llamado "prohibido" a su tabla de Usuarios.
y luego, en tu controlador, puedes tener algo como esto:
class UsersController < ApplicationController
before_filter :deny_banned
protected
def deny_banned
if current_user.banned?
redirect_to root_path, :notice => "You are banned from this site."
end
end
end
Esto no está completo, pero espero que te ayude de alguna manera.