0

我正在尝试向使用 Devise 的应用程序添加新的登录条件。

如果请求来自不在我的白名单上的 IP,我想阻止登录并重定向回 sign_in 页面,并显示一条闪烁消息,说明登录来自外部 IP。

重定向有效,但我设置的 Flash 消息不会使其返回登录页面。我认为这是因为 Devise 在重定向链中神秘地添加了另一个重定向(这会杀死 flash 消息,因为 flash 消息只对一个请求有用)。

这就是我正在做的事情:我检查请求 ip 是否在我的白名单中。如果不是,我会重定向到/users/sign_in并设置 Flash 通知以显示用户无法登录的原因。

这就是我迷路的地方......重定向到/users/sign_in发生后,用户神秘地被重定向到/,然后又重定向回/users/sign_in.

如果用户未登录,最后一个重定向回登录页面是我们自己定义的。但是重定向回根 URL 让我感到困惑。我没有覆盖 session_controller 中的new动作(这是发生这个神秘重定向的地方......),所以据我所知,这就是所有设计逻辑。

有没有人猜测发生了什么,是否存在会导致重定向的设计配置,或者是否有另一种方法我应该处理这整个事情?

在我的 session_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
4

1 回答 1

1

active_for_authentication根据 Devise wiki,您可以通过向用户模型添加方法来为用户添加额外的“验证” 。否则,devise_for路由方法确实接受一个:constraints选项,就像常规 Rails 路由约束一样。将您的白名单逻辑打包到一个响应的类中matches?,您应该会很好。

于 2012-05-30T17:00:22.560 回答