覆盖omniauth身份的“/ auth / identity”页面

时间:2012-01-13 17:28:55

标签: ruby-on-rails rack omniauth

我正在使用没有设计的omniauth进行身份验证,因为我喜欢它的简单性。除了omniauth-facebook,我使用omniauth-identity来提供email / pw-authentication railscast on omniauth-identity描述了如何设置自定义注册和登录页面。但仍可访问identity(/ auth / identity和/ auth / identity / register)提供的默认路由。

我想让这些在我的控制之下,因为我只想让受邀用户注册。有没有办法覆盖机架中间件提供的那些路由? 试着

match "/auth/identity", to: "somewhere#else"

没有办法!

是否有配置可以关闭这些默认路由?文档没有提供任何有关此内容的详细信息......

不幸的是我对Rack很新,​​所以我还没有足够的洞察力来解决这个问题! 如果有人能指出我正确的方向,我会很高兴的!

3 个答案:

答案 0 :(得分:6)

OmniAuth策略对象有一个方法request_phase,它生成一个html表单并将其显示给用户。对于“omniauth-identity”策略,这将是您在/auth/identity网址上看到的表单。

您可以覆盖request_phase方法并将表单生成器替换为例如重定向到自定义登录页面(假设您在/login url处可用)。将以下内容与您的omniauth初始化代码一起放置:

module OmniAuth
  module Strategies
   class Identity
     def request_phase
       redirect '/login'
     end
   end
 end
end

# Your OmniAuth::Builder configuration goes here...

答案 1 :(得分:4)

除了1gors和iains回答:

“/ auth / identity / register”也与GET一起提供,要覆盖,我不得不:

class OmniAuth::Strategies::Identity
  alias :original_other_phase :other_phase
  def other_phase
    if on_registration_path? && request.get?
      redirect '/sign_up'
    else
      original_other_phase
    end
  end
end

答案 2 :(得分:1)

您可以在omniauth.rb中设置方法

:on_login => SessionsController.action(:new)

例如:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :identity,
           :fields => [:nickname],
           :on_login => SessionsController.action(:new),
           :on_registration => UsersController.action(:new),
           :on_failed_registration => SessionsController.action(:registration_failure)
end