You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:20:06