Вас может заинтересовать чтение этой статьи Штеффена Барча . В нем обобщены все плагины авторизации для Ruby on Rails, и я уверен, что это поможет вам найти ваше решение (хотя эта статья посвящена плагинам Rails, их легко экспортировать за пределы Rails).
Штеффен также создал свой собственный плагин под названием «Декларативная авторизация», который, кажется, соответствует вашим потребностям, ИМХО:
- с одной стороны, вы определяете ролей (например, "посетитель", "администратор" ...). Ваши пользователи связаны с этими ролями (в отношениях «многие ко многим»). Вы сопоставляете эти роли с привилегиями (опять же в отношении многих ко многим). Каждая привилегия связана с данным контекстом . Например, роль " посетитель " может иметь привилегию " читать документы ". В этом примере « read » является привилегией и применяется к контексту « documents ».
- Примечание: в плагине Steffen вы можете определить иерархию ролей. Например, вам может потребоваться, чтобы роль « global_admin » включала роль « document_admin », а также роль « comment_admin » и т. Д.
- Вы также можете определить иерархии привилегий: например, привилегия " manage " может включать в себя " read ", " update ", " добавить"и" удалить"привилегии.
- с другой стороны, вы кодируете свое приложение в терминах привилегий и контекстов , а не в терминах ролей. Например, действие по отображению документа должно проверять только то, имеет ли пользователь право « read » в контексте « documents » (нет необходимости проверять, есть ли у пользователя Роль " посетитель " или любая другая роль). Это значительно упрощает ваш код, поскольку большая часть логики авторизации извлекается в другом месте (и, возможно, даже определяется кем-то другим).
Такое разделение между определением пользовательских ролей и определением привилегий на уровне приложения гарантирует, что ваш код не изменится каждый раз, когда вы определяете новую роль. Например, вот как просто будет выглядеть контроль доступа в контроллере:
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>
Плагин Steffen также позволяет управлять доступом на уровне объекта (т.е. на уровне строки). Например, вам может потребоваться определить роль, например " document_author ", и дать ей привилегию " manage " для " Documents ", но только если пользователь является автором документа. Объявление этого правила, вероятно, будет выглядеть так:
role :document_author do
has_permission.on :documents do
to :manage
if_attribute :author => is {user}
end
end
Вот и все! Теперь вы можете получить все документы, которые пользователь может обновлять следующим образом:
Document.with_permissions_to(:update)
Поскольку привилегия " manage " включает в себя привилегию " update ", будет возвращен список документов, автором которых является текущий пользователь.
Конечно, не каждому приложению нужен такой уровень гибкости ... но ваше может.