首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角色的declarative_authorization权限

角色的declarative_authorization权限
EN

Stack Overflow用户
提问于 2010-04-19 21:00:06
回答 2查看 890关注 0票数 3

我正试图将授权添加到一个已经存在的相当大的应用程序中,但我不得不混淆一些细节。

这里是背景:

在我们的应用程序中,我们有一个或多个角色是分层的,大致如下:

代码语言:javascript
复制
BasicUser -> SuperUser -> Admin -> SuperAdmin

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

我们有一个RESTful控制器“用户”,它在Backoffice下有名称空间。简而言之,它是Backoffice::UsersController。

代码语言:javascript
复制
class Backoffice::UsersController < ApplicationController
  filter_access_to :all
  #... RESTful actions + some others
end

,所以问题是:

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

代码语言:javascript
复制
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上尝试了几种变体:

代码语言:javascript
复制
if_attribute :role => is { 'basic_user' }
if_attribute :role => 'basic_user'

它们的效果也是一样的。有人有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2011-03-03 09:20:23

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

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

代码语言:javascript
复制
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

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

希望这能帮到有需要的人。

票数 4
EN

Stack Overflow用户

发布于 2010-05-18 16:16:18

我在我的应用程序中有以下方法,它可以工作

代码语言:javascript
复制
role :super_user do
    includes :basic_user
    has_permission_on :backoffice_users do
      to :edit
      if_attribute :role => is {"basic_user"}
    end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2670842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档