2011-06-23 13 views
5

Actualmente uso Devise para el registro/autenticación del usuario en un proyecto de Rails. Cuando un usuario desea cancelar su cuenta, el objeto de usuario se elimina de forma suave de la siguiente manera.Cómo detener el inicio de sesión del usuario borrado suave con Devise

How to "soft delete" user with Devise

Mi implmenetation tiene una pequeña diferencia de esta manera. El modelo de usuario tiene un atributo 'deleted_flag'. Y, el método soft_delete ejecuta "update_attribtue (: deleted_flag, true)"

Pero, tengo que implementar la acción sign_in. En mi implementación, es el siguiente.

class SessionsController < Devise::SessionsController 
    def create 
    resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")  

    if resource.deleted_flag 
     p "deleted account : " + resource.deleted_flag.to_s 
     sign_out(resource) 
     render :controller => :users, :action => :index 
    else 
     if is_navigational_format? 
     if resource.sign_in_count == 1 
      set_flash_message(:notice, :signed_in_first_time) 
     else 
      set_flash_message(:notice, :signed_in) 
     end 
     end 
     sign_in(resource_name, resource) 
     respond_with resource, :location => redirect_location(resource_name, resource) 
    end 
    end 
end 

Creo que este código tiene puntos extraños.

Si el usuario eliminado intenta cantar, el sistema permite el registro y cierra la sesión inmediatamente. Y, el sistema no puede mostrar el mensaje flash [: alerta] ...

Quiero saber dos puntos.

  1. ¿Cómo implemento para prohibir a los usuarios eliminados iniciar sesión?
  2. ¿Cómo implemento para mostrar el flash [: alerta] cuando el usuario eliminado intenta iniciar sesión?

Respuesta

0

No he probado nada de eso, pero parece que si quieres coger el usuario antes de la autenticación ya sea que usted tiene que escribir una estrategia de autenticación Diseñar o una before_filter que se ejecute antes de authenticate_user!. Algo como:

before_filter :no_deleted_users 

def no_deleted_users 
    if User.find(params[:email]).deleted? 
    redirect_to root_path, :flash => { :error => "Your user was deleted. You cannot log in." } 
    end 
end 

Aunque podría ser más complejo para el usuario que eso. No he jugado con la autenticación previa de Devise.

9

Para detener a un usuario que ha sido 'borrado suave', la mejor manera es sobrescribir el método de la clase find_for_authentication en el modelo de usuario. Tales como:

Class User < ActiveRecord::Base 
    def self.find_for_authentication(conditions) 
    super(conditions.merge(:deleted_flag => false)) 
    end 

Esto generará un correo electrónico o la contraseña mensaje flash inválida por legado (porque no puede encontrar el usuario para autenticar)

En cuanto a su segunda pregunta, sin embargo, usted necesitará un poco de de método en su controlador para agregar un mensaje flash particular. Sin embargo, en mi opinión, debe tratar a los usuarios que son 'blandos' eliminados de la misma manera que si no existieran en la base de datos. Por lo tanto, si intentaron iniciar sesión, deberían recibir un mensaje de correo electrónico o contraseña válido.

+2

Consulte también http://stackoverflow.com/q/8107966/249760, que en realidad logra tanto detener el inicio de sesión de los usuarios como suspender las sesiones actuales. –

Cuestiones relacionadas