从Rails 3.1引擎内访问主应用程序的CanCan规则

5
我正在尝试使用Forem gem,该gem同时利用了CanCan授权框架和我的主应用程序。主应用程序和Rails引擎都有自己的ability.rb文件。
问题出现在布局中,在那里我尝试进行一些授权检查:
    <% if can? :update, User %>
        <%= link_to_current_user :content_method => :login %>.
    <% else %>

当我在引擎上使用布局文件时,它会咨询自己的ability.rb文件以获取授权。显然,我的主应用程序没有规则,因此当不应该进行授权时,授权失败。有什么办法让它强制转到“主”CanCan吗?

谢谢。


你确定你想要 can? :update, User 吗?也许应该是 can? :update, current_user?我怀疑你的和引擎的 ability.rb 实际上并没有混乱。 - jibiel
那不会改变任何事情。可以吗?:update,用户是有效使用。 - alexs333
3个回答

4
我认为最简单的解决方案是对forem的定义进行猴子补丁,以添加自己的声明。
class Forem::Ability
  alias_method :orig_init, :initialize
  def initialize(user)
    orig_init(user)

    # Put your own authorization code here.
  end
end

class Ability < Forem::Ability; end

在引擎的上下文中,can?方法必须使用引擎的控制器/命名空间来授权操作(Forem :: Ability ),在您自己应用的上下文中,它使用您自己的控制器和无命名空间来完成相同的操作。
因此,我认为这里的解决方案(将所有授权操作添加到AbilityForem :: Ability中)应该解决您的问题。
更新:我现在意识到引擎控制器的current_ability方法可能会读取以下内容:
def current_ability
  @current_ability ||= Forem::Ability.new(current_user)
end

默认情况下,它的样式(从cancan gem继承)看起来像这样:

def current_ability
  @current_ability ||= Ability.new(current_user)
end

所以,我上面的解决方案应该可以解决你的问题,但这很可能是它遇到的具体问题。


0

我在Ruby方面仍然是个初学者,但希望能帮到您处理以下问题。

更新

cancan/wiki/admin-namespace所述,尝试另一个解决方法是为模型选择要加载的权限文件。

创建您自己的模型:

# in models/admin_ability.rb

class AdminAbility
  include CanCan::Ability

  def initialize(user)
    # define admin abilities here ....
  end
end

然后,在您的模型中使用它

def current_ability
   @current_ability ||= AdminAbility.new(current_user)
end

我希望这个解决方案能够回答您的问题。

Steph


0
到目前为止,我找到的唯一方法是将两个文件合并成一个,将其分离为模块,并在启动时对两种能力进行猴子补丁。不太美观...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接