首页 > 解决方案 > Cancancan - 在 Rails Admin 中访问被拒绝

问题描述

我遵循了 CanCanCan 的Rails Admin 配置说明。我收到以下错误消息:

RailsAdmin::MainController#dashboard 中的 CanCan::AccessDenied

您无权访问此页面。

提取的源代码(在 #180 行附近):

178      if cannot?(action, subject, *args)
179        message ||= unauthorized_message(action, subject)
180        raise AccessDenied.new(message, action, subject, args)
181      end
182      subject
183    end 

能力.rb:

class Ability
  include CanCan::Ability


  def initialize(user)
    user ||= User.new # guest user (not logged in)
    can :read, :all
    can :manage, Article, user_id: user.id
    return unless user.admin_role?
    can :access, :rails_admin
    can :read, :dashboard
    can :manage, :all
  end
end

rails_admin.rb:

RailsAdmin.config do |config|
  ## == CancanCan ==
  config.authorize_with :cancancan

  config.actions do
    dashboard                     # mandatory
    index                         # mandatory
    new
    export
    bulk_delete
    show
    edit
    delete
    show_in_app
  end
end

Gemfile 包括这些:

gem 'cancancan'
gem 'rails_admin', '~> 2.0', '>= 2.0.2'

不过,权限似乎在其他任何地方都可以正常工作。用户有 2 个可能的角色:管理员或用户。在我的管理员帐户中,我被认为是管理员并且可以做用户不能做的事情。例如:

应用程序/视图/文章/index.html.erb:

<% if can? :update, article %><td><%= link_to 'Edit', edit_article_path(article) %></td> <% end %>

“编辑”选项仅对创建文章的用户或管理员显示。这按预期工作。

标签: ruby-on-railsruby-on-rails-6cancancan

解决方案


在 config/initializers/rails_admin.rb 中,删除config.authorize_with :cancancan和添加下面的代码似乎可以解决问题。具有 admin_role 的用户可以访问 /admin,但其他人不能。我仍然不确定为什么 cancancan 不能很好地播放,但是现在可以按预期工作。

rails_admin.rb:

#config.authorize_with :cancancan

  config.parent_controller = "::ApplicationController"

  config.authorize_with do
    if !current_user || !current_user.admin_role?
      redirect_to(main_app.root_path, alert: "You are not permitted to view this page")
    end
  end

感谢 philtr

作为说明,我使用的是 Rails 6.0.2.2;Rails 管理员 2.0.2;康康康3.1.0;而且我没有使用间隙。


推荐阅读