Rails 7升级后ActiveAdmin权限配置异常问题求助
Rails 7 + ActiveAdmin 3.1.0 权限配置异常问题
环境版本
- Rails 7.0.3
- ActiveAdmin 3.1.0
- Ruby 3.2.0
相关配置代码
active_admin.rb
config.on_unauthorized_access = :access_denied config.namespace :admin do |admin| admin.build_menu :default do |menu| menu.add label: 'Sidekiq', url: '/admin/sidekiq', html_options: { target: :blank }, if: proc { current_admin_user.full_permissions? }, priority: 14 end admin.download_links = proc { current_admin_user.full_permissions? } end
application_controller.rb
def access_denied(_exception) flash['Not Authorized'] sign_out_and_redirect(user) end
问题详情
从Rails 6升级到Rails 7后,当admin.download_links的proc执行且current_admin_user.full_permissions?返回false时,ActiveAdmin会调用application_controller中的access_denied方法,这与Rails 6环境下的行为不一致——Rails 6中仅会隐藏下载链接,不会触发权限拦截跳转。
解决方案
方案1:优化download_links的权限判断逻辑
避免直接依赖全局权限拦截逻辑,改为直接返回布尔值控制显示,确保仅隐藏链接而非触发未授权处理:
admin.download_links = proc { current_admin_user&.full_permissions? || false }
方案2:区分access_denied的触发场景
在全局权限拦截方法中判断请求场景,避免下载链接权限校验时执行强制登出跳转:
def access_denied(exception) # 识别下载相关的权限校验请求 is_download_request = request.path.match?(/\/admin\/.*\/download/) || (exception.respond_to?(:message) && exception.message.include?('download')) if is_download_request flash['Not Authorized'] = '无下载权限' redirect_back(fallback_location: admin_root_path) else flash['Not Authorized'] = '无访问权限' sign_out_and_redirect(user) end end
方案3:使用资源级权限控制
改用ActiveAdmin资源级的权限方法控制下载权限,避免触发全局未授权拦截:
在对应的ActiveAdmin资源文件中添加:
controller do def allow_download? current_admin_user.full_permissions? end end
然后修改active_admin.rb中的配置:
admin.download_links = proc { allow_download? }
内容的提问来源于stack exchange,提问作者Areej Nour
相关产品推荐
相关产品推荐

