Возможно, вас заинтересует this article by Steffen Bartsch. Он суммирует все плагины авторизации для Ruby on Rails, и я уверен, что это поможет вам найти решение (хотя эта статья посвящена плагинам Rails, концепции легко экспортируются за пределами Rails).
Штеффен также построил свой собственный плагин, который называется «декларативный Authorization», который, кажется, чтобы соответствовать вашим потребностям, ИМХО:
- с одной стороны, определить роли (такие, как «посетитель», «админы »...). Ваши пользователей связаны с этими ролями (в отношениях «многие ко многим»). Вы сопоставляете эти роли с привилегиями (снова в отношениях «многие ко многим»). Каждая привилегия связана с заданным контекстом. Например, роль «посетителя« может иметь привилегию »читать документы». В этом примере «, читаемый» является привилегией, и применяется к «контексту» документов.
- Примечание: в плагине Стеффена вы можете определить иерархию ролей. Например, вы могли бы хотеть иметь роль «global_admin» включают «document_admin» роль, а также роль «comment_admin» и т.д.
- Можно также определяет иерархию привилегий: например, "управлять" привилегия может включать "чтения", "обновление", "добавить" и "удалить" привилегии.
- с другой стороны, вы код приложения мышления в терминах привилегий и контексты, а не с точки зрения ролей. Например, действие для отображения документа должно только проверять, имеет ли пользователь привилегию «» «в контексте« документов »(нет необходимости проверять, имеет ли пользователь« посетитель »роль или любая другая роль). Это значительно упрощает ваш код, поскольку большая часть логики авторизации извлекается в другом месте (и, возможно, даже определяется кем-то другим).
Это разделение между определением ролей пользователя и определением привилегий на уровне приложения гарантирует, что ваш код не будет меняться каждый раз, когда вы определяете новую роль.Например, вот как простой контроля доступа будет выглядеть в контроллере:
class DocumentController [...]
filter_access_to :display, :require => :read
def display
...
end
end
И внутри вид:.
<html> [...]
<% permitted_to?(:create, :documents) do %>
<%= link_to 'New', new_document_path %>
<% end %>
</html>
плагин Штеффена также позволяет объектного уровня (т.е. row- уровень) контроля доступа. Например, вы можете захотеть, чтобы определить роль, такие как «document_author» и дать ему «управлять» привилегией «документов», но только если пользователь является автором документа. Декларация этого правила, вероятно, будет выглядеть так:
role :document_author do
has_permission.on :documents do
to :manage
if_attribute :author => is {user}
end
end
Это все, что есть! Теперь вы можете получить все документы, которые пользователь может обновлять так:
Document.with_permissions_to(:update)
Поскольку «управления» привилегия включает в себя «обновление» привилегия, это будет возвращать список документов, автором которой является текущим пользователем.
Конечно, не для каждого приложения потребуется этот уровень гибкости ... но ваш может.