ruby-on-rails - 角色的 declarative_authorization 权限

标签 ruby-on-rails declarative-authorization

我正在尝试向一个已经存在的相当大的应用程序添加授权,但我必须稍微混淆一下细节。

这是背景:

在我们的应用程序中,我们有一些分层的数字或角色,大致如下:

BasicUser -> SuperUser -> Admin -> SuperAdmin

对于授权,每个用户模型实例都有一个与上述对应的属性“角色”。

我们有一个 RESTful Controller “Users”,它在 Backoffice 下命名空间。所以简而言之,它是 Backoffice::UsersController。

class Backoffice::UsersController < ApplicationController
  filter_access_to :all
  #... RESTful actions + some others
end

问题来了:

我们希望用户能够授予用户编辑用户的权限,但前提是他们的角色比他们目前拥有的角色“小”。我在 authorization_rules.rb 中创建了以下内容

authorization do
  role :basic_user do
    has_permission_on :backoffice_users, :to => :index
  end
  role :super_user do
    includes :basic_user
    has_permission_on :backoffice_users, :to => :edit do
      if_attribute :role => is_in { %w(basic_user) }
    end
  end
  role :admin do
    includes :super_user
  end
  role :super_admin do
    includes :admin
  end
end

不幸的是,据我所知,该规则似乎并未得到应用。

  1. 如果我把规则注释掉,没有人可以编辑
  2. 如果我保留规则,你可以编辑每个人

我还尝试了 if_attribute 的几个变体:

if_attribute :role => is { 'basic_user' }
if_attribute :role => 'basic_user'

并且它们得到了相同的效果。有人有什么建议吗?

最佳答案

我相信您现在已经解决了这个问题,但我们刚刚遇到了类似的问题,并想出了一个可能会有帮助的解决方案。纯粹在声明性授权 DSL 中可能无法处理这种情况,但您可以利用 DSL 在您的模型和 View 中做正确的事情。基本上,我们需要访问角色层次结构图。

线索是 declarative_authorization 有一个漂亮的 Controller ,它可以生成一个图表来显示您的角色层次结构。使用他们拥有的相同支持代码,您可以轻松访问任何角色的祖先:

class Role < ActiveRecord::Base
  require 'declarative_authorization/development_support/analyzer'

  has_many :assignments
  has_many :users, :through => :assignments

  validates :name, :presence => true
  validates :name, :uniqueness => true

  def ancestors
    Authorization::DevelopmentSupport::AnalyzerEngine::Role.for_sym(self.name.to_sym, 
      Authorization::Engine.instance).ancestors.map { |r| r.instance_variable_get("@role") }
  end

  def self_and_ancestors
    ancestors << self.name.to_sym
  end
end

然后您可以使用它来做一些事情,比如只在用户编辑器中提供与 current_user 的角色相同或低于 current_user 角色的角色选择,并且拒绝访问或不允许对试图不恰本地提升用户的人进行模型更改.它在声明性授权 DSL 本身的上下文中并不是那么有用,因为它需要首先被解析,从而创建一种循环引用。

希望这可以帮助任何需要它的人。

关于ruby-on-rails - 角色的 declarative_authorization 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2670842/

相关文章:

javascript - 使用Javascript更改link_to中的目标div id

javascript - 代码触发事件时如何使用.submit()

ruby-on-rails - 如何使用声明式授权而不总是将用户 ID 保留为 URL 中的参数?

ruby-on-rails - Rails 授权插件

ruby-on-rails - 所有具有 declarative_authorization 的权限

jquery - 如何在 Rails 4 中使用 jQuery 文件上传?

ruby-on-rails - Rails 3.1 部署到 Heroku 错误

ruby-on-rails - 如何在我的 Rails 应用程序中运行 rake 任务

ruby-on-rails - rails : Undefined method 'to_sym'