Я просмотрел целую кучу различных плагинов авторизации и 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, но я думаю, что это самая «чистая» альтернатива, но при этом она обеспечивает необходимую мне гибкость. ,