0

有没有办法限制用户每天只能登录 5 个 IP 地址?这样,如果用户帐户试图在同一天从第 6 个不同的 IP 地址登录,他们将被拒绝。但是,我希望在一天结束时重置此限制。

如果 Authlogic 没有提供开箱即用的跟踪方法,您对我应该如何实现它有什么想法?正如您可能知道的那样,我已经在使用 Authlogic 进行身份验证。

我的主要目标是限制我的用户与非注册用户共享登录信息的能力;我知道大多数人的 IP 地址会在一天中定期更改,因为几乎没有人拥有个人静态 IP,但我认为 5 是相当数量的限额,即使考虑到用户可能会在他们的 iPhone 上访问我的网站,或者在星巴克等

想法?

更新:在阅读了@tadman 提供的链接上的许多评论后,我认为限制在以前没有的机器上创建的新会话的数量可能更有用,而不是通过 IP 地址。如果我了解 Authlogic 的工作原理,会话是服务器端记录和用户浏览器中的 cookie 的组合,对吗?如果我“退出”我的网站,cookie 仍然存在于我的浏览器中,不是吗?只是具有过期值或类似的东西。我可以对此进行测试吗?这样,如果一台根本没有该 cookie 的计算机我会认为是一个全新的登录,我会将新登录的次数限制为每天 5 次?那是可行的方法吗?

请参阅此用户关于 IP 速率限制的评论,了解我的意思:http ://simonwillison.net/2009/Jan/7/ratelimitcache/#c43031

4

2 回答 2

1

尽管您可以在数据库中跟踪它,但更轻量级的解决方案是使用 Memcached 跟踪它。这使您可以做其他事情,例如限制登录率和限制一个人在给定时间内可以访问的唯一 IP 的数量。

Memcached 的好处是它会在指定的时间段后自动使记录过期。使用数据库驱动的方法,您必须自己做这件事。

示例:http ://simonwillison.net/2009/Jan/7/ratelimitcache/

于 2010-01-21T15:29:21.447 回答
0

我可能会创建一个名为会话的表,其中包含ip_address, logged_in_at, user_id. 当用户登录时,您会执行以下操作:

session = current_user.sessions.build(:ip_address => ip_address)
if session.valid?
  session.save!
  redirect_to root_url
else
  redirect_to you_cant_login_url
end

在您的 session.rb 中,您将拥有

class Session < AR:B
  belongs_to :user
  validate :hasnt_logged_in_a_bunch
protected
  def hasnt_logged_in_a_bunch
    if self.user.sessions.count(:conditions => ['logged_in_at > ?', Time.now.start_of_day]) > 5
      self.errors.add_to_base("You've logged in too many times")
    end
  end

抱歉,如果这有点难看并且不是有效的代码,但它应该有望为您指明正确的方向。

于 2010-01-21T16:06:36.170 回答