2012-05-30 50 views
0

我试图给使用设计的应用程序添加一个新的登录条件。我重定向到sign_in后设计重定向到

如果请求来自不在我白名单上的IP,我想阻止登录并重定向回到sign_in页面,并用闪光消息解释登录来自外部IP。

重定向的工作原理,但我设置的flash消息并没有返回到sign_in页面。我认为这是因为Devise神秘地在重定向链中添加了另一个重定向(这将会中止Flash消息,因为Flash消息仅适用于一个请求)。

这是我在做什么:我检查请求的IP是否在我的白名单。如果不是,我重定向到/users/sign_in并设置flash通知以显示用户无法登录的原因。

这是我迷路 ...重定向后/users/sign_in发生时,用户神秘地被转到/这反过来又重定向到/users/sign_in

上一次重定向回到sign_in页面是我们为用户未登录而自定义的页面。但重定向回到根URL会让我失望。我没有重写sessions_controller中的new动作(这是发生这种神秘重定向的地方......),所以这是所有Devise逻辑,据我所知。

有没有人猜测发生了什么,有没有一个设计配置会导致重定向,还是有另一种方式我应该处理这件事?

在我sessions_controller

class SessionsController < Devise::SessionsController 

    def create 

    unless ip_whitelist.include?(request.remote_ip) 
     redirect_to '/users/sign_in', :notice => "Cannot log in from this IP address." 
     return 
    end 

    ... 

    end 
end 
+0

你试过把你的重定向逻辑作为'before_filter'吗? – thesis

+0

我刚刚做了,我没有发现任何区别 – jordanstephens

回答

1

按照制定的wiki,你可以添加一个额外的“验证”,用户通过添加active_for_authentication方法给您的用户模型。否则,devise_for路由方法确实接受:constraints选项,就像常规的Rails路由约束一样。将您的白名单逻辑打包成一个能够响应matches?的类,并且您应该很好。