Rails ACL Design Вопрос - PullRequest
       0

Rails ACL Design Вопрос

0 голосов
/ 18 ноября 2010

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

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

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

Ответы [ 2 ]

3 голосов
/ 18 ноября 2010

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

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

...