2008-12-08 3 views
5

Hay muchos complementos de rails que manejan los permisos de usuario. Estoy impresionado con la implementación en la joya del hobo, pero no estoy seguro si puedo usar solo esta característica y no las otras partes. GateKeeper es una implementación realmente inteligente, pero tiene algunos errores, aunque es lo suficientemente pequeño, probablemente podría arreglarlo yo mismo. Restful_ACL le proporciona un método de clase para verificar la creación, lo que significa que no puede hacer ninguna comprobación en la instancia en cuestión (no estoy seguro de si contiene hallazgos con ámbito).Complementos de acceso de usuario de Rails

Me gustaría algo que proporcione una versión de alcance de ActiveRecord # find que solo encuentre cosas que el usuario actual puede ver. Esto debería ser lo suficientemente robusto como para decir que solo puede ver las imágenes que se encuentran en galerías propiedad de usted o de uno de sus amigos.

Como beneficio adicional, podría evitar creaciones o actualizaciones (en un before_ * o paso de validación) que no tiene derecho a realizar, incluida la asociación de sus propios registros con un usuario o galería diferente, o la creación de dichos registros .

Respuesta

0

En retrospectiva, voy a utilizar el patrón de Hobo. Es el más simple y más flexible.

0

Puede consultar lockdown. No he implementado esto en el proyecto todavía pero podría ahorrarte algo de trabajo.

3

Puede hacer algunos trucos de autorización realmente complejos en el nivel de modelo con el complemento declarative_authorization. Sin embargo, yo mismo prefiero rails-authorization-plugin - con este define los roles en el nivel del modelo (por ejemplo, alguien es dueño de un recurso) y los permisos en el nivel de controlador (por ejemplo, solo el propietario de un recurso o administrador puede obtener el recurso). Encuentro este enfoque mucho más conciso, especialmente si persiguen un enfoque limpio de REST. Si usted tiene petición como ésta:

GET /posts 

lo que realmente debería volver es todos los mensajes, no sólo los mensajes del usuario actual. Para ello usted debe tener una ruta diferente:

GET /users/:user_id/posts 

donde: user_id se establece en el ID del usuario actual. Esta diferencia se debe entonces refleja en la acción apropiada:

def index 
    user = User.find(params[:user_id]) unless params[:user_id].blank? 
    @posts = 
    if user 
    # get all posts of a user 
    user.posts.all 
    else 
    # get all posts 
    Post.all 
    end 
end 

Ahora, lo que realmente tenemos aquí son dos contextos de autorización - "obtener todos los mensajes de un usuario" y "obtener todos los mensajes" y normalmente se desee establezca diferentes permisos para ambos (por ejemplo, "solo los administradores pueden obtener todas las publicaciones" y "solo el usuario puede hacerlo por sí mismo o un administrador puede obtener todas las publicaciones de un usuario").

+0

Uso una combinación de rethful_authentication y el complemento rails-auth. Rails Auth es muy potente y proporciona una DSL completa para describir tus permisos. –

+0

Eso es restful_authentication, por supuesto: P –

1

Tengo una joya que consiste completamente en poder especificar permisos para los objetos en función de su función. Puede echar un vistazo aquí: http://github.com/nakajima/roleful/tree/master. Funcionaría bien para el tipo de enfoque before_filter que insinuó.

En cuanto a que solo permite a los usuarios acceder a cosas con las que tienen algún tipo de relación, creo que está buscando un candidato principal para los proxies de asociación de Rails. Me gusta fragmento de Milán Novota, aunque yo modifico ligeramente:

def index 
    @posts = user_repo.posts 
end 

private 

def user_repo 
    # find_by_id is **much** faster than regular find, 
    # plus it just returns nil when there's no record 
    if user = User.find_by_id(params[:user_id]) 
    # returns the association proxy 
    user.posts 
    else 
    # returns the class 
    User 
    end 
end 
Cuestiones relacionadas