1

我查看了文档并进行了一些搜索,但我没有看到全能用户(超级用户)级别的选项,或者如何创建一个选项。

有没有人看到或创造了这样做的原因?我认为可以绑定到核心身份验证系统,但我不确定在哪里进行绑定。

非常感谢..

4

2 回答 2

0

通过使用 ApplicationPolicy 的继承,我找到了一种有点 DRYer 的方法。我为访问方法设置别名,并在调用其中任何一个之前绑定一个超级用户测试。如果用户是超级用户,我只返回 true。在我需要将实例方法定义为别名之前,我会在初始化时这样做。

ALIAS_PREFIX = '__original_'

def initialize(user, record)
 @user = user
 @record = record
 [:index?,:show?,:create?,:new?, :update?, :edit?, :destroy?].each do |access_method|
  alias_name = ALIAS_PREFIX+access_method.to_s
  aliasing_original_method(access_method,alias_name)
  self.class.send(:define_method, access_method) do |*args|
    superuser? ? (return true) : send(alias_name, *args)
  end
 end
end

private
def superuser?
  #whatever you want to define a super user
end
def aliasing_original_method(old_name, new_name)
 self.class.send(:alias_method, new_name, old_name)
 self.class.send(:private, new_name)
end

在 [AnyFile]Policy 中我这样做:

def initialize(user, record)
 super(user, record)
end

这将确保子策略中每个方法的真实返回。

[更新]

第一个解决方案有点混乱,我对红宝石(和截止日期)的了解不允许我把它推得更远。无论如何,我找到了另一种方法。因为我总是切换用户的角色,所以我在 ApplicationPolicy 中实现了一个 for_roles 方法。

def for_roles(*args,&block)
    return true if superuser?
    if args.include?(:all) || (@user.role_symbols & args).any?
      block.call
    else false
    end
end

然后,在任何策略中,您可以执行例如

for_roles(:client_admin,:technician) do
  #any rule computation, DB request you want
end
#or
for_roles(:all) do
  #any rule computation, DB request you want
end
于 2015-02-03T10:34:29.477 回答
0

执行此操作的唯一方法是让您的授权检查为已指定为“超级用户”的用户或角色返回 true。所以,它看起来像这样:

def update?
  *normal authorization logic* or is_superuser?
end
def edit?
  *normal authorization logic* or is_superuser?
end
#etc...

private

def is_superuser?
  # configure how to determine who the super users are and return true/false
end

您可以在假设您从应用程序策略继承类级别策略的情况下定义is_superuser?私有方法;ApplicationPolicy否则,您将需要在每个策略中定义它。

于 2015-01-21T18:01:34.983 回答