Разрешения и роли хранятся в БД, рельсы 3.1 - PullRequest
0 голосов
/ 14 декабря 2011

В моем приложении я хочу реализовать роли и разрешения в них таким образом, чтобы администраторы пользователей могли создавать новые роли в своих браузерах. Поэтому мне нужны таблица разрешений и таблица ролей, где каждая роль является комбинацией разрешений. На данный момент я использовал гем CanCan, но это поведение не по умолчанию для этого драгоценного камня, и, наконец, я получил очень сложную структуру ролей и проверку разрешений. Кто-нибудь может сказать мне, какой драгоценный камень обеспечивает такое поведение, или, может быть, я должен сделать это без каких-либо драгоценных камней?

1 Ответ

1 голос
/ 14 декабря 2011

См. Способности в базе данных и Способность для других пользователей из вики CanCan:

class Ability
  include CanCan::Ability

  def initialize(user)
    can do |action, subject_class, subject|
      user.permissions.find_all_by_action(aliases_for_action(action)).any? do |permission|
        permission.subject_class == subject_class.to_s &&
          (subject.nil? || permission.subject_id.nil? || permission.subject_id == subject.id)
      end
    end
  end
end

РЕДАКТИРОВАНИЕ
Некоторые оптимизации загрузки:

class Ability
  include CanCan::Ability

  def initialize(user, context = nil)
    if context.nil?
      can do |action, subject_class, subject|
        user.permissions.find_all_by_action(aliases_for_action(action)).any? do |permission|
          permission.subject_class == subject_class.to_s &&
           (subject.nil? || permission.subject_id.nil? || permission.subject_id == subject.id)
      end
    elsif context == :post
      can :manage, Post, :id => y
    elsif context == :users
      can :manage, User, :id => x
    end
  ...

А в контроллерах:

class UsersController
  protected
  def current_ability
    Ability.new(current_user, :users)

class PostsController
  protected
  def current_ability
    Ability.new(current_user, :posts)
...