Я просмотрел целую кучу различных плагинов авторизации и ACL, и, как и вам, мне не понравился подход CRUD, который использовался большинством из них.
В итоге наиболее подходящей для меня оказалась установка, подобная той, что использует Redmine. Я не знаю, происходит ли это от какого-либо именованного плагина, но я потратил некоторое время на то, чтобы понять его и внес необходимые коррективы для моего случая.
По сути, он позволяет использовать контроллеры и действия, глобальные или для конкретных моделей. Вы начинаете с указания того, какие различные разрешения можно назначать:
MyApplication::ACL.mapper do |map|
map.permission :view_project, {:projects => :show}
map.permission :manage_project, {:projects => [:update, :edit, :post_status]}
map.permission :delete_project, {:projects => :destroy}
end
Следующим шагом является назначение одного или нескольких разрешений роли, которая представляет собой модель с сериализованным полем, в котором могут храниться разрешения, т.е.:
<#Role id: 1 name: "Intern" permissions: [:view_project] >
<#Role id: 2 name: "Member" permissions [:view_project, :manage_project] >
А затем вы сопоставляете разные роли с пользователями по модели членства. Членство также может быть сопоставлено с конкретными моделями, такими как Project, поскольку вам может быть разрешено управлять одним проектом, но не другим, или оно может быть глобальным, как некоторые действия индекса, которые должны быть ограничены, но вы не знаете, какую модель авторизовать. против еще.
В контроллерах вы проверяете все это, используя:
before_filter :authorize, :only => [:show, :update, :edit,
:post_status, :destroy]
И авторизация — это, конечно, метод, который проверяет, является ли текущий пользователь членом какой-либо роли, имеющей разрешение, необходимое для текущего контроллера и действия.
Это, хотя и длинное описание здесь, только вкратце, как это работает :) Это намного сложнее, чем другие плагины ACL, но я думаю, что это самая «чистая» альтернатива, но при этом обеспечивающая гибкость, которая мне нужна.
person
DanneManne
schedule
18.11.2010