Le puede interesar leer this article by Steffen Bartsch. Resume todos los complementos de autorización para Ruby on Rails, y estoy seguro de que lo ayudará a encontrar su solución (aunque este artículo trata sobre los complementos de Rails, los conceptos son fácilmente exportables fuera de Rails).
Steffen también construyó su propio plugin, llamado "declarativa Autorización", que parece coincidir con sus necesidades, en mi humilde opinión:
- , por un lado, se define papeles (como "visitante", "admin "...). Sus usuarios están asociados a estos roles (en una relación muchos a muchos). Asigna estos roles a privilegios (de nuevo en una relación muchos a muchos). Cada privilegio está vinculado a un contexto dado . Por ejemplo, la función "visitante" puede tener el privilegio "leer documentos". En este ejemplo, "lea" es el privilegio y se aplica al contexto "documentos".
- Nota: en el complemento de Steffen, puede definir una jerarquía de roles. Por ejemplo es posible que desee tener el papel "global_admin" incluir el papel "document_admin", así como el papel "comment_admin", etc.
- También puede define jerarquías de privilegios: por ejemplo, la "gestionar" privilegio podría incluir la " leer", "actualización ", "añadir " y "borrar " privilegios.
- , por otro lado, que codifique la aplicación de pensar en términos de privilegios y contextos, no en términos de roles. Por ejemplo, la acción para mostrar un documento solo debe verificar si el usuario tiene el privilegio de "leer" en el contexto "documentos" (no es necesario verificar si el usuario tiene el rol "visitante" o cualquier otro rol). Esto simplifica enormemente su código, ya que la mayoría de la lógica de autorización se extrae en otro lugar (y tal vez incluso sea definida por otra persona).
Esta separación entre la definición de los roles de usuario y la definición de los privilegios de nivel de aplicación garantiza que su código no cambiará cada vez que defina un nuevo rol.Por ejemplo, aquí es cómo es simple el control de acceso se vería en un controlador:
class DocumentController [...]
filter_access_to :display, :require => :read
def display
...
end
end
Y dentro de un punto de vista:.
<html> [...]
<% permitted_to?(:create, :documents) do %>
<%= link_to 'New', new_document_path %>
<% end %>
</html>
plug-in de Steffen permite también a nivel de objeto (es decir, de fila nivel) control de acceso. Por ejemplo, es posible que desee definir una función como "document_author" y darle "gestionar" privilegio "en documentos", pero solamente si el usuario es el autor del documento. La declaración de esta regla probablemente sería así:
role :document_author do
has_permission.on :documents do
to :manage
if_attribute :author => is {user}
end
end
¡Eso es todo! Ahora puede obtener todos los documentos que se le permite al usuario actualizar como esto:
Document.with_permissions_to(:update)
Desde el "gestionar" privilegio incluye el privilegio "actualización", esto devolverá la lista de documentos cuyo autor es el usuario actual.
Por supuesto, no todas las aplicaciones necesitarán este nivel de flexibilidad ... pero las suyas podrían.