ruby-on-rails - 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 %>
“编辑”选项仅对创建文章的用户或管理员显示。这按预期工作。
解决方案
在 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
作为说明,我使用的是 Rails 6.0.2.2;Rails 管理员 2.0.2;康康康3.1.0;而且我没有使用间隙。
推荐阅读
- tomcat - nginx路由路径中的“#”导致tomcat报错“Invalid character found in the request target...”
- java - 如何将俄罗斯日期格式转换为美国日期格式?
- flutter - 从 Navigator.pop 接收地图
- javascript - React Hooks 的 Keydown/up 事件无法正常工作
- javascript - TranslateY css 对窗口滚动的影响
- javascript - jQuery xmlns="..." 属性导致 Chrome 中的格式问题
- javascript - 如果对象子对象包含某个字符串(JavaScript),则从对象子对象获取数据
- python - 我正在尝试 MCQ 的 Distractor Generator 得到以下错误,谁能解释一下?
- c++ - 重心坐标并不总是有效(3d)
- javascript - 视差滚动效果变得迟钝