Rails:按IP地址限制每日用户登录次数?

时间:2010-01-21 15:27:32

标签: ruby-on-rails authlogic

有没有办法限制用户的登录访问权限,例如,每天只有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

2 个答案:

答案 0 :(得分:1)

虽然您可以在数据库中跟踪它,但更轻量级的解决方案是使用Memcached跟踪它。这允许您执行其他操作,例如限制登录率并限制一个人在给定时间内可以访问的唯一IP的数量。

Memcached的好处是它会在指定的时间段后自动使记录失效。使用数据库驱动的方法,您必须自己完成。

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

答案 1 :(得分:0)

我可能会创建一个名为sessions的表,其中包含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

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