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

Rails 8自带认证如何实现路由权限控制及扩展生成器?

Rails 8 内置认证路由权限控制方案

问题描述

我正在使用Rails 8,并通过rails generate authentication命令生成了认证功能。我希望限制特定路由的访问权限,确保未认证用户无法访问这些路由。在Devise中,可通过如下约束助手实现该需求:

authenticated :user do
  # Allow all actions on subjects and nested students only for authenticated users
  resources :subjects do 
    resources :students
  end
end

请问Rails 8是否提供内置方法实现此功能?能否为新的生成器添加该功能?

解答

1. Rails 8 内置的路由权限控制方法

Rails 8 自带的认证系统已经内置了路由层面的权限约束能力,不需要依赖Devise。你可以直接使用authenticate方法,语法和Devise的authenticated几乎一致:

authenticate :user do
  # 仅允许已认证用户访问subjects及嵌套的students路由
  resources :subjects do
    resources :students
  end
end

当未认证用户访问这些路由时,会自动被重定向到登录页面,和Devise的行为完全一致。

2. 给认证生成器添加默认权限约束

如果希望每次运行rails generate authentication时,自动生成带权限约束的路由,可以通过自定义生成器模板实现:

  • 首先在项目的lib/templates/rails/authentication目录下创建routes.rb.tt文件(如果目录不存在,自行创建)
  • 在模板中加入authenticate :user do ... end的包裹逻辑,示例如下:
Rails.application.routes.draw do
  authenticate :user do
    # 这里可以添加你希望默认受保护的资源路由
    resources :subjects do
      resources :students
    end
  end

  # 保留生成器默认的认证相关路由
  resource :session, only: [:new, :create, :destroy]
  resources :users, only: [:new, :create]
end
  • 保存模板后,再次运行rails generate authentication,生成的config/routes.rb就会自动包含权限约束的代码。

你也可以根据需求调整模板内容,比如添加更多默认受保护的资源,或者修改认证的用户模型(如果不是默认的User)。


内容的提问来源于stack exchange,提问作者Diego Llamas Velasco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 18:40:08