Active Admin是否有等效于before_action :authenticate_user!的鉴权方法?
Active Admin 中实现类似 Devise
before_action :authenticate_user! 的认证与重定向 当然有!Active Admin 和 Devise 深度集成,完全能实现你要的认证校验和重定向逻辑,甚至比普通控制器更灵活,下面分场景给你具体方案:
一、全局层面的管理员认证(所有 Active Admin 页面生效)
如果你用了 Active Admin 默认安装流程,它会自动生成 AdminUser 模型,同时自带对应的 Devise 认证方法 authenticate_admin_user!。只需在初始化配置里开启即可:
# config/initializers/active_admin.rb ActiveAdmin.setup do |config| # 启用管理员认证校验 config.authentication_method = :authenticate_admin_user! # 指定当前管理员用户的获取方法 config.current_user_method = :current_admin_user # 其他配置项... end
设置后,所有未登录的用户访问 Active Admin 页面时,会自动重定向到管理员专属登录页(默认路径是 /admin/login),刚好匹配你的需求。
二、针对特定资源的局部认证(类似控制器的 except/only)
如果只想给某个 Active Admin 资源(比如你提到的 Order)设置差异化认证规则,就像普通控制器那样,可以直接在资源定义里用 before_action:
# app/admin/orders.rb ActiveAdmin.register Order do # 除 show 页面外,其他页面都要求管理员认证 before_action :authenticate_admin_user!, except: [:show] # 你的资源配置(列表展示、表单设置、自定义动作等)... end
三、自定义认证逻辑(用自己的 User 模型而非默认 AdminUser)
如果你的项目没有用默认的 AdminUser,而是通过自身的 User 模型区分管理员和普通用户,只需稍作调整:
- 先在
User模型里添加管理员判断规则:
# app/models/user.rb class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable # 自定义管理员判断逻辑,比如通过 role 字段区分 def admin? role == "admin" end end
- 修改 Active Admin 初始化配置,指定自定义认证方法:
# config/initializers/active_admin.rb ActiveAdmin.setup do |config| # 替换为自定义的认证方法 config.authentication_method = :authenticate_admin! config.current_user_method = :current_user end
- 在
ApplicationController中实现这个自定义认证方法:
# app/controllers/application_controller.rb class ApplicationController < ActionController::Base def authenticate_admin! # 先校验普通用户是否登录 authenticate_user! # 再校验是否具备管理员权限 unless current_user.admin? redirect_to root_path, alert: "你没有访问管理员后台的权限" end end end
这样设置后,普通用户即使登录了账号,访问 Active Admin 时也会被重定向到首页(或你指定的页面),完美实现你的需求。
内容的提问来源于stack exchange,提问作者Benjamin J. B.
相关产品推荐
相关产品推荐

