2011-04-26 20 views
20

Siguiendo la guía aquí, he añadido un atributo booleano a mi base de datos utilizando una migración:Idear: La restricción de acciones a los administradores

rails generate migration add_admin_to_user admin:boolean 

He configurado mi cuenta para ser un administrador (admin = 1) a través de los carriles consola. Tengo un controlador que quiero restringir el acceso a ciertas acciones (nuevas, editar, crear y destruir) solo para administradores.

También tendré usuarios normales, solo quiero restringir el acceso a estas acciones para los administradores solo en este controlador. Actualmente, estoy usando el código:

before_filter :authenticate_user!, :only => [:new, :edit, :create, :destroy] 

que restringe el acceso a usuarios registrados - ¿cómo llevar esto un paso más allá y requieren los administradores?

Respuesta

33

puede implementar fácilmente su propio before_filter para permitir el acceso solo a los usuarios administradores mediante el uso de .admin? método asociado con su modelo de usuario. por ejemplo:

before_filter :verify_is_admin 

private 

def verify_is_admin 
    (current_user.nil?) ? redirect_to(root_path) : (redirect_to(root_path) unless current_user.admin?) 
end 
+0

¡Eso lo hizo! Gracias :) –

9

Usted tendrá que definir su propio método en el filtro de antes y después de detectar si el usuario es un administrador o no en ese método antes de llamar: authenticate_user!

before_filter :custom_method, :only => [:new, :edit, :create, :destroy] 

private 
def custom_method 
    authenticate_user! 

    if current_user.admin 
    return 
    else 
    redirect_to root_url # or whatever 
    end 
end 

Usted tendrá que hacer lo authenticate_user! paso anterior a verificar la variable current_user.

ian.

+0

problema al llamar esto antes de authenticate_user! es que si alguien que no ha iniciado sesión intenta acceder a él, el filtro arrojará una excepción en lugar de redirigir, ya que el usuario_actual no está definido –

+1

@Will: authenticate_user! Redireccionará automáticamente al visitante a la acción sign_in si no está conectado, por lo que ni siquiera llegaría a la cláusula if –

+1

Diría que este es el mejor enfoque. Mantiene la abstracción que Devise le proporciona con la encapsulación y solo luego mejora. Tu propio código permanece simple pero expresivo. – josemota

Cuestiones relacionadas