ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RailsAdmin 认证接入全指南:authenticate_with 与 current_user_method 配置详解

RailsAdmin 认证接入全指南:authenticate_with 与 current_user_method 配置详解 后端【免费下载链接】rails_adminRailsAdmin is a Rails engine that provides an easy-to-use interface for managing your data项目地址https://gitcode.com/gh_mirrors/ra/rails_admin点击查看免费下载本文围绕 RailsAdmin 的认证Authentication机制展开系统讲解如何在 Rails 应用中通过authenticate_with与current_user_method两个配置钩子接入 Devise、Sorcery、HTTP Basic 等主流认证方案并说明退出登录按钮的触发原理。读完本文你将能够为 RailsAdmin 后台配置一套完整可用、与主应用共用会话的用户认证方案并理解其底层执行时机与调用链。认证机制的设计思想RailsAdmin 本身不认证只提供钩子RailsAdmin 是一个管理后台引擎它不内置任何用户系统而是把谁来登录后台完全交给宿主 Rails 应用决定。从源码结构看认证逻辑通过控制器层面的两个before_action注入# app/controllers/rails_admin/application_controller.rb before_action :_authenticate! before_action :_authorize! before_action :_audit!其中_authenticate!只是简单地执行你配置的认证块def _authenticate! instance_eval(RailsAdmin::Config.authenticate_with) end由于块是在控制器实例的上下文中通过instance_eval执行的因此它可以直接调用当前控制器上的任何方法——比如 Devise 提供的authenticate_user!、Warden 提供的warden对象、Sorcery 提供的require_login以及你自己写的current_user。这正是各类认证 gem 能与 RailsAdmin 无缝集成的根本原因。对应的默认值定义在 lib/rails_admin/config.rbDEFAULT_AUTHENTICATION proc {} DEFAULT_AUTHORIZE proc {} DEFAULT_CURRENT_USER proc {}也就是说不配置时这三个钩子都是空操作任何人都可以访问后台——这也是为什么任何生产环境应用都必须显式配置认证。两个核心配置钩子authenticate_with 与 current_user_method原文档指出你可以各自可选提供两样东西authenticate_with块在任何 RailsAdmin action 执行之前触发你的认证逻辑对应_authenticate!before_actioncurrent_user_method块返回当前登录的用户模型供 UI 使用例如在导航栏显示用户信息、生成编辑当前用户链接等。配置统一写在config/initializers/rails_admin.rb中最简单的骨架如下RailsAdmin.config do |config| config.authenticate_with do # 在这里写认证逻辑例如 # warden.authenticate! scope: :user # authenticate_user! # require_login end config.current_user_method do current_user end end两个配置方法的源码实现见 lib/rails_admin/config.rb 与 lib/rails_admin/config.rb传入块则存储未传入则返回当前值或默认空 proc。_current_userUI 侧的统一入口在视图和 helper 中RailsAdmin 通过_current_user这个 helper 方法来取当前用户它同样是对current_user_method配置块的instance_eval调用见 app/controllers/rails_admin/application_controller.rbhelper_method :_current_user, :_get_plugin_name def _current_user instance_eval(RailsAdmin::Config.current_user_method) end顶栏中编辑当前用户的链接edit_user_link依赖_current_user的email与模型配置见 app/helpers/rails_admin/application_helper.rb因此如果你的认证体系能提供current_user并让其响应emailRailsAdmin 会自动在导航栏为用户生成指向其自身记录的编辑链接。退出登录按钮logout_path 触发规则原文档指出如果应用响应名为logout_path的路由辅助方法RailsAdmin 就会在应用右上角添加一个 Log out 按钮。这一行为的实际实现位于 app/helpers/rails_admin/application_helper.rbdef logout_path if defined?(Devise) scope Devise::Mapping.find_scope!(_current_user) begin main_app.send(destroy_#{scope}_session_path) rescue StandardError false end elsif main_app.respond_to?(:logout_path) main_app.logout_path end end def logout_method return [Devise.sign_out_via].flatten.first if defined?(Devise) :delete end可以看到两条路径使用 Devise 时根据_current_user找到其 Devise scope动态调用destroy_#{scope}_session_path例如destroy_user_session_path请求方法则取Devise.sign_out_via配置默认:delete未使用 Devise 时只要主应用路由响应logout_path例如 Sorcery 应用自定义了该路由就直接使用它请求方法默认为:delete。按钮本身渲染在 app/views/layouts/rails_admin/_secondary_navigation.html.erb并且仅在_current_user存在且logout_path.present?时出现% if logout_path.present? % li classnav-item % link_to logout_path, method: logout_method, class: nav-link, data: {turbo: false} do % span classbadge bg-danger% t(admin.misc.log_out) %/span % end % /li % end %方案一接入 Devise / WardenDevise 是 Rails 生态中最常见的认证方案RailsAdmin 对其有内建适配。原文档给出了基于 Warden scope 的官方推荐写法。使用 user scope在config/initializers/rails_admin.rb中RailsAdmin.config do |config| config.authenticate_with do warden.authenticate! scope: :user end config.current_user_method(:current_user) end使用 admin scope如果后台使用独立的admin登录 scope即devise_for :admins则对应改为RailsAdmin.config do |config| config.authenticate_with do warden.authenticate! scope: :admin end config.current_user_method(:current_admin) end别忘了路由无论使用哪个 scope都要在主应用config/routes.rb中声明对应的 Devise 路由devise_for :users # 或 devise_for :admins原文档还提到一个历史遗留问题Devise 早期版本曾存在视图相关 bug原文档指向 rails_admin#1386 与 devise issue #3321建议复制 Devise 视图按 issue 说明修改文档标注该问题已在后续版本修复指向retain_me仓库的提交b7534807。源码层面的 Warden 兼容从源码注释看RailsAdmin 本身就倾向Warden 生态Config的注释明确写着 RailsAdmin is setup to try and authenticate with warden. If warden is found, then it will try to authenticate见 lib/rails_admin/config.rb并给出authenticate_admin!与自定义 warden scope 的示例。因此 Devise 用户的推荐路径本质就是借助其底层的 Warden 接口。方案二接入 SorcerySorcery 是另一种轻量认证方案原文档给出了社区验证过的解决方案由 David Tuite 提出。认证配置Sorcery 需要手动调整config/initializers/rails_admin.rbRailsAdmin.config do |config| config.authenticate_with do # Use sorcerys before filter to auth users require_login end config.current_user_method(:current_user) end覆写 not_authenticated同时需要覆写ApplicationController中的not_authenticated方法Sorcery 在检测到未认证请求时回调该方法并确保跳转到主应用的登录路由而不是 RailsAdmin 自己的路由class ApplicationController ActionController::Base # Overwrite the method sorcery calls when it # detects a non-authenticated request. def not_authenticated # Make sure that we reference the route from the main app. redirect_to main_app.login_path end end注意这里使用了main_app.login_path而非裸login_path因为 RailsAdmin 作为引擎挂载时login_path会被解析到引擎自己的命名空间必须显式加main_app.前缀才能指向主应用路由——这是引擎集成中一个极易踩坑的细节。生产环境兼容性修复针对 Sorcery 与 RailsAdmin 在生产环境的兼容问题社区建议adamkangas 提出上下文见 sorcery issue #147在config/initializers/sorcery.rb末尾强制注入Sorcery::ControllerActionController::Base.send(:include, Sorcery::Controller)该做法确保 Sorcery 的控制器方法在任何情况下都被正确加载。方案三手动认证HTTP Basic bcrypt如果不想引入认证 gem可以完全手动实现。原文档给出了两条路线加密密码推荐与明文密码强烈不推荐。使用 bcrypt 加密密码推荐① 添加 gem 并安装gem bcrypt然后运行bundle install。② 生成 User 模型rails g model user name:string password_digest:string并在模型中启用has_secure_passwordclass User ApplicationRecord has_secure_password end③ 配置认证块编辑config/initializers/rails_admin.rbconfig.authenticate_with do authenticate_or_request_with_http_basic(Login required) do |username, password| user User.where(name: username).first user.authenticate(password) if user end end这里使用 Rails 内置的authenticate_or_request_with_http_basic实现 HTTP Basic 认证按用户名查库再用 bcrypt 的authenticate方法校验密码摘要。④ 结合角色进行授权如果需要区分管理员权限可配合authorize_with实现完整方案见 docs/manually.mdconfig.authorize_with do |controller| if current_user.nil? redirect_to main_app.new_account_session_path, flash: {error: Please Login to Continue..} elsif !current_user.admin? redirect_to main_app.root_path, flash: {error: You are not Admin bro!} end end使用明文密码⚠️ 强烈不推荐原文档明确警告保存明文密码可能使你触犯 GDPR 等法规。仅出于演示目的可以这样写config.authenticate_with do authenticate_or_request_with_http_basic(Login required) do |username, password| user User.where(email: username, password: password, admin: true).first user end end其逻辑是从数据库按邮箱 密码 admin 标记查询用户查到则放行查不到则拒绝登录。生产环境务必使用 bcrypt 等加密方案。更简化的静态 Basic 认证如果只是临时保护后台例如开发或演示环境可以直接硬编码用户名密码参见 docs/basic-access-authentication.mdRailsAdmin.config do |config| config.authenticate_with do authenticate_or_request_with_http_basic(Site Message) do |username, password| username foo password bar end end end认证与授权的分工别忘了 authorize_with认证Authentication回答你是谁授权Authorization回答你能做什么。RailsAdmin 中两者是独立的配置钩子且执行顺序固定_authenticate!在前_authorize!在后见 app/controllers/rails_admin/application_controller.rb。因此认证通过后还需要用authorize_with决定用户能否访问具体模型与动作例如RailsAdmin.config do |config| config.authorize_with do redirect_to main_app.root_path unless current_user.is_admin? end end也可以接入 CanCanCan / Pundit 适配器config.authorize_with :cancancan/:pundit其适配器实现位于 lib/rails_admin/extensions/cancancan/authorization_adapter.rb 与 lib/rails_admin/extensions/pundit/authorization_adapter.rb底层会依次调用authorize抛异常、authorized?返回布尔值、query作用域限定与attributes_for创建时属性限制四个方法。完整的 CanCanCan 配置与 RailsAdmin 权限动词表见 docs/cancancan.md自定义授权适配器示例见 docs/customized-authorization.md。补充阅读Devise 完整集成示例Sorcery 集成方案手动认证bcrypt / HTTP BasicHTTP Basic 静态认证授权配置与 CanCanCan / Pundit 适配器赞分享后端【免费下载链接】rails_adminRailsAdmin is a Rails engine that provides an easy-to-use interface for managing your data项目地址https://gitcode.com/gh_mirrors/ra/rails_admin点击查看免费下载相关推荐Mac菜单栏管理指南5分钟把图标收进刘海屏Mac菜单栏管理指南5分钟把图标收进刘海屏 Mac 菜单栏管理先说结论Ice 免费开源藏、取、排、美化一条龙。 你的菜单栏每天都在被这样消耗 装后端OpenMetadata Sigma 连接器接入指南配置、认证与血缘提取详解OpenMetadata Sigma 连接器接入指南配置、认证与血缘提取详解 本指南以 OpenMetadata 官方连接器文档 Sigma.md http数据目录数据血缘数据治理后端MCP 服务Mermaid Live Editor免费在浏览器里画、预览、分享 Mermaid 图表的在线编辑器Mermaid Live Editor免费在浏览器里画、预览、分享 Mermaid 图表的在线编辑器 写技术文档总少不了插一张架构图。传统做法是打开绘图工具前端开发者工具数据可视化上一篇从TinyMCE 7到8如何规划、实施和验证你的平滑升级之旅下一篇DEIM vs 传统DETR为什么改进匹配机制能提升30%收敛速度创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表