Вопрос о дизайне Rails ACL

Я работаю над устаревшей базой кода rails, и мне нужно реализовать некоторую логику ACL, основанную не на стандартных операциях CRUD над объектами, а на пользовательской логике того, какие части страницы отображаются для разных групп пользователей. Эти «части» страницы не определяются никакими объектами в базе данных, поэтому я предполагаю, что системы ACL на основе объектов могут быть здесь не лучшим образом.

В настоящее время я изучаю declarative_authorization, но еще не определил, может ли он делать что-либо, кроме объектных разрешений.

Это должно быть довольно распространенным вариантом использования для веб-приложений, и я бы предпочел не запускать еще один ACL. Есть ли у кого-нибудь предложение для сторонней библиотеки, которая будет хорошо работать для этого?


person prairiedogg    schedule 17.11.2010    source источник
comment
Я узнал немного больше о том, когда использовать ACL, просмотрев этот вопрос, stackoverflow.com/questions/3164550/, но все еще не ближе к ответу.   -  person prairiedogg    schedule 18.11.2010


Ответы (2)


Я думаю, что CanCan может вам помочь. Он прост в использовании и должен делать именно то, что вам нужно. Вот RailsCast: Авторизация с помощью CanCan

person Zabba    schedule 17.11.2010
comment
Попробовав CanCan, я обнаружил, что вам не нужно просто придерживаться разрешений CRUD. Вы можете объявить настраиваемые разрешения для любой модели или для объекта nil. - person prairiedogg; 18.11.2010

Я просмотрел целую кучу различных плагинов авторизации и 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