维护Devise的Rails路由白名单

时间:2014-02-03 15:49:19

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

在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行)上的所有操作。匹配其他三个是我被绊倒的地方。

P.S。登录强制执行在ApplicationController内全局发生,以便干掉我的控制器,并集中我公开允许的路由的白名单。我可以在每个控制器内执行此操作,但这不是目标。

1 个答案:

答案 0 :(得分:0)

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