【问题标题】:How to configure Devise+Cancan correctly for guest users如何为访客用户正确配置 Devise+Cancan
【发布时间】:2013-02-15 03:24:24
【问题描述】:

在 Rails 3.2 应用程序中,我使用的是 Devise + CanCan。该应用程序以前仅限登录用户访问。我正在添加能够阅读网站某些部分的访客用户/能力。

我无法理解“正确”的设置方式,特别是控制器中需要 before_filter :authenticate!load_and_authorize_resource 的哪种组合。

在处理这个问题时,我已将能力等级降至最低。

#Ability.rb
class Ability
  include CanCan::Ability

  def initialize(user_or_admin)
    user_or_admin ||= User.new

    can :manage, :all
  end
end

在无模型/静态页面主页控制器中

#home_controller.rb
class HomeController < ApplicationController
  load_and_authorize_resource
  def index
    ...some stuff
  end
end

#application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :authenticate!
  ...more stuff
end

通过此设置,未登录的用户将被重定向到 Devise 登录页面。

如果我从应用程序控制器中删除 before_filter :authenticate!,我会收到来自 activesupport-3.2.11/lib/active_support/inflector/methods.rb 的错误 uninitialized constant Home

如果我从家庭控制器中删除 load_and_authorize_resource,此错误就会消失。

这对我的简化测试能力类来说没问题,但是当我开始添加角色和能力时,我需要让 CanCan 处理 Home 控制器,即需要调用 load_and_authorize_resource

谁能帮助我理解为什么在删除 before_filter :authenticate! 时会出现此错误,并指出任何解释为访客用户设置 Devise+Cancan 的“正确”方法的信息。到目前为止我发现的信息只解释了如何设置能力类,而不是如何配置设计。

【问题讨论】:

    标签: ruby-on-rails devise cancan


    【解决方案1】:

    问题是没有资源可以授权。因此,您只需调用authorize_resource 而不是load_and_authorize_resource。有关更多信息,请参阅 cancan 文档中的 authorizing controller actions

    更新:您还必须将类指定为 false:authorize_resource class: false

    那么你的家庭控制器将如下所示:

    class HomeController < ActionController::Base
      authorize_resource class: false
    
      def show
        # automatically calls authorize!(:show, :home)
      end
    end
    

    此信息在Non-RESTful controllers section 中。对于那个很抱歉。

    【讨论】:

    • 感谢@max,这是有道理的,我学到了一些新东西。但是,当我从家庭控制器只调用authorize_resource 时,我仍然收到initialized constant 错误。你知道我还能在哪里寻找这个问题的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    相关资源
    最近更新 更多