【问题标题】:Not Authorized when using CanCan and Devise (Rails 4)使用 CanCan 和 Devise (Rails 4) 时未授权
【发布时间】:2015-09-01 17:26:16
【问题描述】:

我正在尝试在自定义路线上提供一些资源,但通过我的 CanCan gem 被拒绝访问。

带有自定义路由的PlaysController:即将到来的播放

class PlaysController < ApplicationController
  load_and_authorize_resource

  def upcoming_plays
    @plays = Play.where("date_of_play >= ?",Time.now ).order(date_of_play: :desc )
  end
  #...
end

app/views/plays/upcoming_plays.html.erb

<!-- This displays links to plays/ID for play occurring in the future-->
<div id="show-all-plays"> 
  <% @plays.each do |current_play| %>
      <%= render partial: "layouts/play_link" , 
          locals: {play: current_play} %>
  <% end %>
</div>

config/routes.rb

Rails.application.routes.draw do
  get 'plays/upcoming_plays', :as => 'upcoming_plays', :path=>'upcoming_plays'
  #...
end

app/models/ability.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    if user != nil and user.role == 'admin'
       can :manage, :all
     else
       can :read, :all
     end
  end
end

在导航到 /upcoming_plays.html 时收到错误:

You are not authorized to access this page.

它阻止我通过重定向到根页面查看该页面

我不确定 CanCan 是否认为我正在尝试管理/修改 Plays 模型,但我要做的只是从数据库中读取值。有任何想法吗?感谢您的帮助!

编辑: Rokibul Hasan 建议添加

skip_authorize_resource :only => :upcoming_plays

到播放控制器。哪个有效!然而,这似乎是一个黑客。如果我想添加管理员在此页面上编辑内容的功能怎么办?我不希望所有人都可以使用被禁止的操作。似乎这可能是个问题,有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 devise cancan


    【解决方案1】:

    看来问题出在你的能力课上,请你改写你ability如下

    class Ability
     include CanCan::Ability
    
      def initialize(user)
         user ||= User.new  
         if user.role == 'admin'
           can :manage, :all
         else
           can :read, :all
         end
      end
    end
    

    load_and_authorize_resource 可以自动授权控制器中的每个操作。对于替代解决方案,您可以将以下代码添加到您的控制器以跳过授权中的 upcoming_plays

     skip_authorize_resource :only => :upcoming_plays
    

    【讨论】:

    • skip_authorize_resource 工作(用户 ||= ... 没有)。然而,这对我来说似乎很老套。我更喜欢使用适当的 CanCan 授权的方法,而不是绕过它。有任何想法吗?感谢您的回复!
    猜你喜欢
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多