【问题标题】:Maintain whitelist of Rails routes for Devise为 Devise 维护 Rails 路线白名单
【发布时间】:2014-02-03 15:49:19
【问题描述】:

在 Ruby Rails 项目中,我有一个字符串数组,与 Rails 路由协议使用的控制器/动作语法相匹配。这些是我的公共路由,不需要身份验证。我想将该列表与当前的controller#action 进行比较,以强制执行登录身份验证。

问题:我无法弄清楚 Rails 如何解析路由字符串并确定适当的controller#action。我需要复制此功能以进行比较,但 Rails 核心代码非常糟糕,而且我无法确定逻辑。

就伪代码而言,这是我的 YAML 语法中的白名单数组示例,来自配置文件...

public_routes: [
  'public',
  'auth/sessions#new',
  'auth/sessions#create',
  'admin#login'
]

然后在我的ApplicationController...

before_filter :check_authentication!

...

def check_authentication!
  Settings.public_routes.each do |this_route|
    # parse string this_route into a namespace::controller#action
    return if [current route matches parsed route]
  end
  # enforce authentication procedures here
end

我已经有逻辑允许PublicControllerpublic_routes 数组的第 1 行)上的所有操作。匹配其他三个是我被绊倒的地方。

附:登录强制在ApplicationController 内全局进行,以干燥我的控制器,并集中我的公开允许路由的白名单。我可以在每个控制器内完成,但这不是目标。

【问题讨论】:

    标签: ruby-on-rails ruby rails-routing controllers


    【解决方案1】:

    你可以从参数中取回当前的命名空间、控制器和动作值,比如 params[:controller],所以在你的比较循环中,只需组成 url。或者你可以用 request.fullpath 方法取回请求的 url。

    【讨论】:

    • 这看起来很有希望,知道在哪里可以找到默认包含在params 中的值列表吗?
    • 我曾经使用这个 gem github.com/michaeldv/awesome_print 来检查任何变量的值。
    猜你喜欢
    • 1970-01-01
    • 2014-06-20
    • 2017-11-19
    • 1970-01-01
    • 2011-09-29
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多