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
相关产品推荐
相关产品推荐

