我关注了CanCanCan的configuration instructions for 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
ability.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种可能的角色:管理员或用户。在我的管理员帐户上,我被视为管理员,可以执行用户无法执行的操作。例如:
app / views / articles / 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 Admin 2.0.2; Cancancan 3.1.0;而且我没有使用间隙。