6

Tengo un recurso de grupo que estoy tratando de configurar con las autorizaciones adecuadas.Múltiples declaraciones before_filter para correct_user y admin

La lógica de autorización que estoy tratando de poner en práctica es la siguiente:

  1. Solamente los miembros del grupo debe ser capaz de ver su grupo.
  2. Un administrador puede ver cualquier grupo, así como realizar otras acciones.

Estoy intentando hacer esto con las siguientes afirmaciones before_filter en el controlador de grupo:

before_filter :signed_in_user 
before_filter :correct_user, only: :show 
before_filter :admin_user, only: [:show, :index, :edit, :update, :destroy] 

Correct_user funciona como he verificado que los miembros del grupo sólo pueden ver su grupo. Sin embargo, lo que quiero que suceda es que la cláusula admin: show anule esto, para que un administrador pueda ver cualquier grupo. Actualmente eso no está funcionando. Supongo que tengo algo mal aquí con mi filtro de pedidos y opciones.

¿Alguien me puede decir dónde me he equivocado?

EDITAR

Adición de mi código del método según la petición del Amar:

private 

def correct_user 
    # User has to be a member to view 
    @group = Group.find(params[:id]) 
    redirect_to(root_path) if @group.members.find_by_member_id(current_user).nil? 
end 

def admin_user 
    redirect_to(root_path) unless current_user.admin? 
end 
+0

Pruebe admin_user antes del filtro anterior correct_user o en show action make conditional para el usuario admin y otras – Amar

+0

Thanks Amar. Intenté poner el filtro admin_user arriba correcto_user pero eso no lo solucionó. Podría poner la condición en la acción pero quiero ver si hay una manera de hacerlo con before_filter. – pejmanjohn

+0

En una inspección posterior con la forma en que lo tengo escrito anteriormente, el filtro requiere que el usuario sea ambos y admin Y un usuario correcto para poder ver el grupo. Quiero que sea OR – pejmanjohn

Respuesta

2

actualización el método correct_user o crear otro método con la siguiente definición, retire espectáculo desde otro filtro y añadir before_filter con el nuevo método .

def correct_user 
    @group = Group.find(params[:id]) 
    redirect_to(root_path) if @group.members.find_by_member_id(current_user).nil? && !current_user.admin? 
end 
+0

Just tested y eso funciona muy bien. Necesitaba agregar un "&&" entre las declaraciones booleanas. – pejmanjohn

Cuestiones relacionadas