ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Devise 5 完整上手指南:基于 Warden 的 Rails 灵活认证方案(模块化架构、生成器、路由与测试实践)

Devise 5 完整上手指南:基于 Warden 的 Rails 灵活认证方案(模块化架构、生成器、路由与测试实践) 认证鉴权后端【免费下载链接】deviseFlexible authentication solution for Rails with Warden.项目地址https://gitcode.com/gh_mirrors/de/devise点击查看免费下载导读本文以当前仓库GitHub 加速计划 / de / devise版本 5.0.4的 README 与核心源码为对象系统讲解 Devise 的模块化认证架构、安装与生成器用法、控制器/视图/路由/参数清洗的定制方案以及测试辅助、OmniAuth、多模型登录、Active Job 邮件投递和 Rails API 模式等进阶主题。读完本文你将能够从零在一个 Rails 7 应用中接入 Devise按需挑选 10 个认证模块并基于源码理解每个配置项背后的真实行为。Devise 是一个基于 Warden。它同时具备以下特性完全基于 Rack基于 Rails 引擎的完整 MVC 解决方案支持同一时刻多个模型同时登录如 User 与 Admin采用模块化理念——只使用你真正需要的部分。一、架构总览10 个模块各司其职Devise 由 10 个模型模块组成它们通过 lib/devise/modules.rb 统一注册。注册表中可以看到每个模块绑定的控制器、路由与策略例如database_authenticatable绑定sessions控制器与session路由registerable绑定registrations控制器与registration路由含cancelconfirmable绑定confirmationslockable绑定unlocksrecoverable绑定passwordsomniauthable绑定omniauth_callbacks。各模块职责如下模块核心职责Database Authenticatable在数据库中对密码进行哈希并存储用于登录时校验既支持 POST 请求也支持 HTTP Basic AuthenticationOmniauthable为模型添加 OmniAuth 支持可通过 GitHub、Google 等第三方提供商登录Confirmable发送确认指令邮件并在登录时校验账号是否已确认Recoverable重置用户密码并发送重置指令找回密码Registerable处理注册流程sign up并允许用户编辑、注销自己的账号Rememberable生成与清除记住我的 cookie token实现免登录Trackable记录登录次数、登录时间戳与 IP 地址Timeoutable会话在指定时间内无活动则过期Validatable提供邮箱与密码的校验该模块是可选且可定制的你可以定义自己的校验规则Lockable在连续多次登录失败后锁定账号可通过邮件或指定时间后解锁模块的注册顺序是有讲究的注册表源码注释明确说明trackable放在最后Stats for last, so we make sure the user is really signed in而database_authenticatable、rememberable这类带策略的模块排在最前rememberable还被标记为no_input: true无需用户输入即可参与认证。二、快速起步安装与生成器2.1 安装与初始化Devise 5 从 Rails 7 起可用。安装并运行初始化生成器bundle add deviserails generate devise:install生成器会在控制台输出一系列指引其中必须完成的一步是为 Devise 邮件器在每个环境配置默认 URL 选项。例如config/environments/development.rbconfig.action_mailer.default_url_options { host: localhost, port: 3000 }初始化生成器还会安装一个 initializer其中描述了 Devise 的全部配置选项模板见 lib/generators/templates/devise.rb官方强调必须通读它。2.2 为模型启用 Devise将MODEL替换为应用用户模型的类名通常是User也可能是Admin运行rails generate devise MODEL该命令会创建模型若不存在并为其配置默认模块同时改写config/routes.rb指向 Devise 控制器。随后检查模型里是否需要追加额外配置如confirmable、lockable若追加务必检查生成器创建的迁移文件并取消对应注释段。例如给模型加上confirmable就需在迁移中取消 Confirmable 段的注释。最后运行rails db:migrate。注意修改 Devise 配置选项后应重启应用包括停止 Spring否则可能出现用户无法登录、路由辅助方法未定义等诡异错误。在模型内部devise方法由 lib/devise/models.rb 实现它按Devise::ALL定义的顺序对所选模块排序为每个模块extend ClassMethods并include模块本身最后把选项以send(:#{key}, value)的形式落到模型类上。这也是模块配置可在模型上按实例覆盖全局默认值的机制来源。三、控制器过滤器与辅助方法Devise 会向控制器和视图注入一批辅助方法生成逻辑见 lib/devise/controllers/helpers.rb 的define_helpers每个 mapping 都会动态生成authenticate_#{mapping}!、#{mapping}_signed_in?、current_#{mapping}、#{mapping}_session四个方法并在 Action Controller / Action View 加载时注册为helper_method。假设模型是Userbefore_action :authenticate_user!user_signed_in? # 是否已登录 current_user # 当前登录用户 user_session # 该 scope 的会话数据登录成功、确认账号或更新密码后Devise 会查找 scope 级 root 路径跳转例如:user资源会优先使用user_root_path否则回退到root_path。因此路由中需要设置根路径root to: home#index也可以覆写after_sign_in_path_for与after_sign_out_path_for定制跳转钩子。默认逻辑lib/devise/controllers/helpers.rb是先尝试resource_root_path再回退root_path最后回退/。若模型叫Member则对应方法自动变为before_action :authenticate_member! member_signed_in? current_member member_session另一个值得一提的扩展是devise_group见 lib/devise/controllers/helpers.rb它可以把多个 scope 组成一组一次性生成authenticate_blogger!、blogger_signed_in?、current_blogger、current_bloggers等方法适合用户或管理员任一登录即可访问的场景。四、模型级配置模块选项与哈希算法成本devise方法接受若干选项来配置模块。例如调整哈希算法的拉伸次数devise :database_authenticatable, :registerable, :confirmable, :recoverable, stretches: 13除:stretches外还可定义:pepper、:encryptor、:confirm_within、:remember_for、:timeout_in、:unlock_in等。全部选项与默认值都写在devise:install生成的 initializer 中通常位于config/initializers/devise.rb其模板见 lib/generators/templates/devise.rb。从 lib/devise.rb 源码可以确认这些全局默认值stretches 12bcrypt 成本测试环境模板建议设为 1 加速测试官方强烈建议其他环境不低于 10且成本随数字指数增长pepper nil配合哈希加盐建议用rails secret生成password_length 6..128、email_regexp /\A[^\s][^\s]\z/remember_for 2.weeks、extend_remember_period false、expire_all_remember_me_on_sign_out trueallow_unconfirmed_access_for 0.days未确认默认完全不可访问、confirm_within nil确认 token 无期限、reconfirmable truetimeout_in 30.minuteslock_strategy :failed_attempts、unlock_strategy :both、maximum_attempts 20、unlock_in 1.hour、last_attempt_warning truereset_password_within 6.hours、sign_in_after_reset_password true、sign_in_after_change_password trueauthentication_keys [:email]、case_insensitive_keys [:email]、strip_whitespace_keys [:email]sign_out_via :delete、sign_out_all_scopes truenavigational_formats [*/*, :html, :turbo_stream]其中*/*用于兼容旧版 Internet Explorerhttp_authenticatable false、params_authenticatable trueparent_controller ApplicationController、parent_mailer ActionMailer::Baseparanoid false开启后确认/找回密码/解锁流程无论邮箱是否存在都返回相同结果防用户枚举clean_up_csrf_token_on_authentication true登录成功后清理 CSRF token防止 token 固定攻击模型上的取值优先级由 lib/devise/models.rb 的Devise::Models.config机制保证实例/类上显式赋值 父类 Devise.*全局默认值。五、强参数Strong Parameters三个需要清洗的动作自 Devise 4 起参数清洗 API 发生变化Rails 4 将参数清洗从模型移入控制器因此 Devise 在控制器层处理。只有三个动作会把参数透传给模型需要清洗其默认允许的参数为动作控制器动作默认允许参数sign_inDevise::SessionsController#create仅认证键如emailsign_upDevise::RegistrationsController#create认证键 passwordpassword_confirmationaccount_updateDevise::RegistrationsController#update认证键 passwordpassword_confirmationcurrent_password这些默认值在 lib/devise/parameter_sanitizer.rb 的DEFAULT_PERMITTED_ATTRIBUTES常量中定义认证键则从resource_class.authentication_keys动态提取。5.1 简单标量字段在ApplicationController中加一个 before actionlazy wayclass ApplicationController ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:username]) end enddevise_controller?用于判断当前控制器是否为 Devise 控制器见 lib/devise/controllers/helpers.rb保证该钩子只作用于 Devise 流程。5.2 嵌套属性若使用accepts_nested_attributes_for需要把嵌套结构和类型一并告知devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, address_attributes: [:country, :state, :city, :area, :postal_code]])5.3 块形式完全自定义传入块可以完全改变 Devise 的默认行为。允许username与email两个简单标量def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_in) do |user_params| user_params.permit(:username, :email) end end注册表单中的角色复选框会以数组形式提交而数组不属于 Strong Parameters 的标量类型需要这样配置def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up) do |user_params| user_params.permit({ roles: [] }, :email, :password, :password_confirmation) end endpermit方法还支持except:关键字移除默认参数例如devise_parameter_sanitizer.permit(:account_update, except: [:password])源码注释示例见 lib/devise/parameter_sanitizer.rb。5.4 多模型自定义 ParameterSanitizer不同 Devise 模型可用不同清洗器。推荐继承Devise::ParameterSanitizerclass User::ParameterSanitizer Devise::ParameterSanitizer def initialize(*) super permit(:sign_up, keys: [:username, :email]) end end然后在ApplicationController中覆写devise_parameter_sanitizer方法按资源类分派class ApplicationController ActionController::Base protected def devise_parameter_sanitizer if resource_class User User::ParameterSanitizer.new(User, :user, params) else super # Use the default one end end end自定义清洗器会替换默认Devise::ParameterSanitizer.new(resource_class, resource_name, params)见 lib/devise/controllers/helpers.rb的构造调用。六、视图定制从复制默认视图到 scoped viewsDevise 是 Rails 引擎所有视图打包在 gem 内部默认 ERB 视图位于 app/views/devise。复制视图到应用rails generate devise:views当应用存在多个 Devise 模型如User与Admin时默认所有模型共用同一套视图。开启 scope 化视图即可按角色区分# config/initializers/devise.rb config.scoped_views true开启后支持users/sessions/new与admins/sessions/new这类按角色命名的视图若 scope 内找不到视图仍回退使用默认的devise/sessions/new。对应回退逻辑由 lib/devise/controllers/scoped_views.rb 实现。按 scope 生成视图rails generate devise:views users只生成部分模块的视图如registerable与confirmable使用-v标志rails generate devise:views -v registrations confirmations视图生成器的实现见 lib/generators/devise/views_generator.rb它支持-bform builder默认在检测到 SimpleForm 时用 simple_form_for否则 form_for、-v选择视图目录等选项SimpleForm 模板位于 lib/generators/templates/simple_form_for。七、控制器定制继承并扩展视图级定制不够时可以按 scope 定制控制器1. 用生成器创建自定义控制器需指定 scoperails generate devise:controllers [scope]以users为 scope控制器会生成到app/controllers/users/sessions 控制器形如class Users::SessionsController Devise::SessionsController # GET /resource/sign_in # def new # super # end ... end用-c标志只生成指定控制器rails generate devise:controllers users -c sessions。Devise 内置控制器的源码可在 app/controllers/devise 中查看。2. 告知路由使用该控制器devise_for :users, controllers: { sessions: users/sessions }3.推荐但非必须将视图从devise/sessions复制到users/sessions保持控制器与视图一致跳过也不会出错Rails 会因继承继续使用devise/sessions下的视图。4. 修改或扩展控制器动作。完全覆写class Users::SessionsController Devise::SessionsController def create # custom sign-in code end end或在原有行为之上叠加新逻辑class Users::SessionsController Devise::SessionsController def create super do |resource| BackgroundWorker.trigger(resource) end end end这对在登录/注册等动作时触发后台任务、记录事件非常有用。经验提示Devise 用 flash 消息告知用户登录成功或失败应用应恰当使用flash[:notice]与flash[:alert]不要整体打印 flash hash只打印特定 key。某些场景 Devise 会向 flash 加入:timedout键仅内部使用、不可展示若需打印整个 hash 应先移除该键。八、路由配置devise_for 的完整选项Devise 自带默认路由通过devise_for方法定制。该方法在 lib/devise/rails/routes.rb 中实现支持:class_name、:path、:path_names等选项例如同时改路径名可用于 I18n 场景devise_for :users, path: auth, path_names: { sign_in: login, sign_out: logout, password: secret, confirmation: verification, unlock: unblock, registration: register, sign_up: cmon_let_me_in }devise_for会在解析路由后触发 Devise::RouteSet#finalize!完成 Warden 配置Devise.configure_warden!并重新生成 URL 辅助方法Devise.regenerate_helpers!。devise_for支持的主要选项源码注释均附有示例class_name:——指定映射的类如devise_for :users, class_name: Accountpath:——替换 URL 前缀如devise_for :users, path: accountssingular:——自定义单数名影响 helper 方法名authenticate_#{singular}!、current_#{singular}等与 scope 名如devise_for :admins, singular: :managerpath_names:——覆写:sign_in、:sign_out、:sign_up、:password、:confirmation、:unlock等默认路径名controllers:——指定控制器如devise_for :users, controllers: { sessions: users/sessions }failure_app:——失败时调用的 Rack 应用sign_out_via:——签出接受的 HTTP 方法默认:delete可传数组如[:get, :post]module:——控制器命名空间默认devise如module: users可整体改名空间skip:——跳过某些控制器路由skip: :all表示不生成任何路由only:——skip的反面只生成指定控制器路由skip_helpers:——跳过生成 Devise URL 辅助方法默认 falseformat:——是否包含(.:format)默认 true可设 false 禁用constraints:、defaults:、router_name:——与 Rails 对应 DSL 行为一致源码还说明了devise_for的嵌套行为放在namespace中会自动嵌套控制器如publisher/sessions且 helpers 会变为current_publisher_account、authenticate_publisher_account!等。需要更深的定制——例如在/users/sign_in之外再开放/sign_in——可以把自定义路由包在devise_scope块中devise_scope :user do get sign_in, to: devise/sessions#new enddevise_scope在路由中别名as源码 lib/devise/rails/routes.rb。注意devise_scope :user用单数形式而devise_for :users用复数形式。关键提醒若要使用current_user等辅助方法路由中仍需存在devise_for即使不想生成任何路由也应写成devise_for :users, skip: :all。此外路由 DSL 还提供authenticate/authenticated/unauthenticated三个约束方法lib/devise/rails/routes.rb可基于登录状态约束路由块例如authenticated :admin do root to: admin/dashboard#show, as: :admin_root end root to: landing#show完整的路由配置示例可参考测试应用的 test/rails_app/config/routes.rb其中覆盖了class_name、path、constraints、format: false、skip_helpers、singular、自定义sign_out_via、namespace嵌套、engine 路由router_name等真实组合。九、Hotwire/Turbo 集成Devise 将 Hotwire/Turbo 发起的请求视为导航请求并为错误响应与重定向配置了匹配的状态码。新应用默认生成以下响应配置已有应用可在 initializer 中追加Devise.setup do |config| # ... # 使用 Hotwire/Turbo 时错误响应与部分重定向的 http 状态码必须如下。 # Devise 对存量应用的默认是 200 OK 与 302 Found新应用使用与 # Hotwire/Turbo 行为匹配的新默认值。 config.responder.error_status :unprocessable_content # Rack 3.1 或更高 # config.responder.error_status :unprocessable_entity # Rack 3.0 或更低 config.responder.redirect_status :see_other end重要这些自定义响应要求respondersgem 版本不低于 3.1.0使用前请务必升级。若正从 rails-ujs 迁移还需检查视图中的两处改动按钮/表单提交前的确认弹窗选项data-confirm需改为data-turbo-confirm设置链接请求方法的data-method需改为data-turbo-methodbutton_to和form无需改动Turbo 可自行处理。若以:delete方式登出且用链接非 form 包裹的按钮配合method: :delete登出同样需要按上述规则更新。Devise 的共享视图本身不提供登出链接/按钮。十、I18nflash 消息与邮件主题Devise 通过 I18n 配合:notice、:alert两个 flash key 输出消息。自定义 locale 文件en: devise: sessions: signed_in: Signed in successfully.还可在sessions下按路由中配置的资源单数名区分消息en: devise: sessions: user: signed_in: Welcome user, you are signed in. admin: signed_in: Hello admin!Devise 邮件器也使用类似模式定制主题en: devise: mailer: confirmation_instructions: subject: Hello everybody! user_subject: Hello User! Please confirm your email reset_password_instructions: subject: Reset instructions仓库自带的 locale 文件 config/locales/en.yml 列出了全部可用消息测试辅助 locale德语、葡萄牙语等位于 test/support/locale。注意Devise 控制器继承自 ApplicationController。若应用使用多语言务必在 ApplicationController 中设置I18n.locale。十一、测试辅助控制器测试与集成测试Devise 为控制器测试和集成测试内置辅助方法需要在测试类中引入对应模块源码位于 lib/devise/test/controller_helpers.rb 与 lib/devise/test/integration_helpers.rb。11.1 控制器测试Rails 5 的控制器测试超类为ActionDispatch::IntegrationTest引入Devise::Test::IntegrationHelpersclass PostsControllerTest ActionController::TestCase include Devise::Test::IntegrationHelpers # Rails 5 endRails 5 使用Devise::Test::ControllerHelpersclass PostsControllerTest ActionController::TestCase include Devise::Test::ControllerHelpers # Rails 5 endRSpec 用户可在spec/support/devise.rb、spec/spec_helper.rb或spec/rails_helper.rb中配置务必放在require rspec/rails之后RSpec.configure do |config| config.include Devise::Test::ControllerHelpers, type: :controller config.include Devise::Test::ControllerHelpers, type: :view end然后即可使用sign_in/sign_outsign_in user sign_in user, scope: :admin测试 Devise 内部控制器或继承自 Devise 的控制器时需在请求前显式指定 mapping因为控制器测试不经过路由而 Devise 本应从路由获取该信息test GET new do # 模拟路由通过 env 设置 Devise scope 的行为 request.env[devise.mapping] Devise.mappings[:user] # 用 sign_in helper 登录 fixture 中的 User 记录 sign_in users(:alice) get :new # assert something end11.2 集成测试引入Devise::Test::IntegrationHelpersclass PostsTests ActionDispatch::IntegrationTest include Devise::Test::IntegrationHelpers end可用的方法实现见 lib/devise/test/integration_helpers.rb底层委托给 Warden 的login_as/logoutsign_in users(:bob) sign_in users(:bob), scope: :admin sign_out :userRSpec 的:featurespec 可引入IntegrationHelpersRSpec.configure do |config| config.include Devise::Test::IntegrationHelpers, type: :feature end与控制器测试不同集成测试无需设置devise.mappingenv因为 mapping 可从测试执行的路由推断。十二、OmniAuth第三方提供商登录Devise 开箱即用地支持 OmniAuth。在config/initializers/devise.rb中指定提供商config.omniauth :github, APP_ID, APP_SECRET, scope: user,public_repoconfig.omniauth的实现见 lib/devise.rb它为每个 provider 创建Devise::OmniAuth::Config并注册到omniauth_configs。模型需要启用:omniauthable模块注册表 lib/devise/modules.rb 将其绑定到omniauth_callbacks控制器与omniauth_callback路由。对应回调控制器源码见 app/controllers/devise/omniauth_callbacks_controller.rb模型实现见 lib/devise/models/omniauthable.rbOmniAuth 路径前缀配置见 lib/devise/omniauth/config.rb。十三、配置多模型User 与 Admin 并行登录Devise 支持任意多个 Devise 模型。例如在 User 之外增加一个只需认证与超时的 Admin# 创建含所需字段的迁移 create_table :admins do |t| t.string :email t.string :encrypted_password t.timestamps null: false end # Admin 模型内部 devise :database_authenticatable, :timeoutable # 路由内部 devise_for :admins # 受保护控制器内部 before_action :authenticate_admin! # 控制器与视图中 admin_signed_in? current_admin admin_session也可以直接运行 Devise 生成器完成上述配置。重要设计约束这些模型拥有完全不同的路由登录/登出等不能共享同一控制器。若希望不同角色共享相同动作官方建议采用基于角色的方案——为模型提供角色列或使用专门的授权 gem。十四、Active Job 集成后台投递 Devise 邮件若用 Active Job 通过队列后端异步投递 Action Mailer 消息可在模型中覆写send_devise_notification让 Devise 邮件走现有队列def send_devise_notification(notification, *args) devise_mailer.send(notification, self, *args).deliver_later endDevise 邮件器的默认实现与邮件模板可分别在 app/mailers/devise/mailer.rb 与 app/views/devise/mailer 中查看含确认指令、重置密码指令、解锁指令、邮箱变更、密码变更五类邮件。十五、密码重置 token 与 Rails 日志安全启用 Recoverable 后需警惕被盗的密码重置 token 可能让攻击者进入应用。Devise 会尽力生成随机、安全的 token且数据库中只存 token 摘要、绝不存明文。但 Rails 默认日志行为可能把明文 token 泄漏进日志文件Action Mailer 在 DEBUG 级别记录所有外发邮件全文——邮件中的密码重置 token 会随之泄漏Active Job 在 INFO 级别记录每个入队任务的所有参数——若用deliver_later发送重置邮件token 同样泄漏。Rails 生产环境日志级别默认是 INFO。若想防止 token 泄漏考虑将生产日志级别调到 WARNconfig/environments/production.rbconfig.log_level :warntoken 生成相关的实现可参考 lib/devise/token_generator.rb其中Devise.friendly_token默认生成 20 字符的 URL-safe 随机串实现见 lib/devise.rb而Devise.secure_compare使用ActiveSupport::SecurityUtils.secure_compare做常数时间比较、防时序攻击lib/devise.rb。十六、其他 ORM 与 Rails API 模式16.1 其他 ORMDevise 支持 ActiveRecord默认与 Mongoid。切换 ORM 只需在 initializer 中 require 对应文件require devise/orm/mongoid # 或默认的 devise/orm/active_recordORM 适配层位于 lib/devise/orm/active_record.rb 与 lib/devise/orm/mongoid.rb。16.2 Rails API 模式Rails 5 的 API 模式仅 API 的 Rails 应用下Devise 大体可用不会抛异常。但由于 API 应用不支持基于 cookie 的浏览器认证这正是 Devise 的默认方式可启用http_authenticatable策略——它基于 HTTP Basic Auth在每个请求上认证用户。Devise 的 HTTP Auth 默认关闭需在 initializer 中为 database 策略开启config.http_authenticatable [:database]这并不限制你实现自定义 warden 策略应用内或基于 gem 的扩展均可。API 常见的认证方式是 token 认证。API 模式下的测试API 模式改变了中间件栈顺序可能影响Devise::Test::IntegrationHelpers通常表现为集成测试 helper如#sign_in报undefined method [] for nil:NilClass。解决办法是在test.rb中重排中间件Rails.application.config.middleware.insert_before Warden::Manager, ActionDispatch::Cookies Rails.application.config.middleware.insert_before Warden::Manager, ActionDispatch::Session::CookieStore另外注意由于不支持视图Confirmable、Recoverable、Lockable 中依赖邮件的流程目前无法在 API 模式下直接支持。十七、WardenDevise 的底层认证框架Devise 基于 Warden——一个由 Daniel Neighman 创建的通用 Rack 认证框架。Devise 通过 lib/devise.rb 的configure_warden!完成与 Warden 的对接设置failure_app Devise::Delegator、default_scope、intercept_401 false并为每个 mapping 注册策略与 session 序列化。自定义 warden 策略或 failure app 可在 initializer 的config.warden块中配置config.warden do |warden_config| warden_config.intercept_401 false warden_config.default_strategies(scope: :user).unshift :some_external_strategy end十八、开发与测试跑 Devise 自身测试套件贡献者通常需要为改动编写测试。进入仓库顶层目录后bundle install bin/testDevise 同时支持 ActiveRecord 与 Mongoid可通过两个环境变量切换测试组合DEVISE_ORM——指定 ORM默认active_record切到 MongoidDEVISE_ORMmongoid bin/test Devise.orm :mongoid运行 Mongoid 测试需要本机有 MongoDB 服务器2.0 或更新版本。命令输出会显示当前使用的变量值。BUNDLE_GEMFILE——指定 bundler 使用的 Gemfile代替当前目录下的那个。仓库的 gemfiles 目录为每个受支持的 Rails 版本准备了一份 GemfileGemfile-rails-7-0、Gemfile-rails-7-1、Gemfile-rails-7-2、Gemfile-rails-8-0、Gemfile-rails-main。例如复现 Ruby 3.4 Rails 8.0 的失败环境chruby 3.4.0 # 或 rbenv shell 3.4.0或 rvm use 3.4.0 等 BUNDLE_GEMFILEgemfiles/Gemfile-rails-8-0 bundle install BUNDLE_GEMFILEgemfiles/Gemfile-rails-8-0 bin/test两者可组合Mongoid 场景BUNDLE_GEMFILEgemfiles/Gemfile-rails-8-0 bundle install BUNDLE_GEMFILEgemfiles/Gemfile-rails-8-0 DEVISE_ORMmongoid bin/testDevise 使用 minitest 作为测试框架仓库 Gemfile 与 Rakefile 可确认bin/test # 运行全部测试 bin/test test/models/trackable_test.rb # 运行指定文件 bin/test test/models/trackable_test.rb:16 # 按行号运行单个测试 bin/test test/models/trackable_test.rb -n /update.*record/ # 按正则运行各模块测试用例分布在 test/models、test/controllers、test/integration、test/mailers、test/generators 等目录是学习模块行为的最佳范例。十九、其他实用信息从零学 Rails官方明确建议初次构建 Rails 应用时不要使用 Devise——它要求对 Rails 框架有较好理解。可以先从零手写一个简单认证系统巩固基础再回来使用 Devise。版本支持策略Devise 旨在维护所有未达生命周期终点EOL的 Ruby / Rails 版本具体版本兼容性以 Ruby 与 Rails 的维护策略及仓库测试矩阵为准。Bug 与安全报告安全相关 bug 不要走 issue tracker应邮件联系维护者heartcombo.ossgmail.com一般问题建议使用 StackOverflow 的devise标签而非 issue tracker。许可Devise 采用 MIT License见 MIT-LICENSE版权归 Rafael França、Carlos Antonio da Silva2020-至今与 Plataformatec2009-2019。赞分享认证鉴权后端【免费下载链接】deviseFlexible authentication solution for Rails with Warden.项目地址https://gitcode.com/gh_mirrors/de/devise点击查看免费下载相关推荐Devise核心模块详解构建灵活的认证系统Devise核心模块详解构建灵活的认证系统 本文深入解析了Devise认证框架的四个核心模块Database Authenticatable密码哈希与验证认证鉴权后端2025最强双因素认证方案基于Devise-Two-Factor的Rails应用安全加固指南2025最强双因素认证方案基于Devise Two Factor的Rails应用安全加固指南 你还在为用户账号安全发愁吗 当用户密码被拖库、撞库攻击肆虐传后端应用安全Nuxt 模块测试指南单元测试、E2E 测试与手动验证的完整实践Nuxt 模块测试指南单元测试、E2E 测试与手动验证的完整实践 测试是保证 Nuxt 模块在各种应用环境中稳定工作的关键环节。本文基于 Nuxt 官方模块开前端后端Web框架SSR上一篇百度网盘直链解析终极指南告别限速5分钟获取真实下载地址下一篇华硕笔记本性能调优终极指南G-Helper轻量级控制工具完全教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表