0

ユーザーのログイン アクセスを、たとえば毎日 5 つの IP アドレスのみに制限する方法はありますか? ユーザー アカウントが 6 番目の異なる IP アドレスから同じ日にログインしようとすると、それらは拒否されます。ただし、この制限は一日の終わりにリセットしたいと思います。

Authlogic がすぐにこれを追跡する方法を提供しない場合、これを実装する方法についてどのようなアイデアがありますか? お察しのとおり、私はすでに認証に Authlogic を使用しています。

私の主な目標は、ユーザーがログイン情報を未登録ユーザーと共有できないようにすることです。個人の静的 IP を持っている人はほとんどいないため、ほとんどの人の IP アドレスは 1 日を通して定期的に変更されることはわかっていますが、ユーザーが iPhone で私のサイトにアクセスしたり、スターバックスなど

考え?

更新: @tadman によって提供されたリンクに関する多くのコメントを読んだ後、IP アドレスではなく、以前はセッションがなかったマシンで作成される新しいセッションの数を制限する方が便利かもしれないと考えています。Authlogic の仕組みを理解していれば、セッションはサーバー側のレコードとユーザーのブラウザ内の Cookie の組み合わせですよね? サイトから「ログアウト」しても、Cookie はブラウザに残りますよね? 期限切れの値などを使用するだけです。それに対してテストできますか?その Cookie をまったく持たないコンピューターの場合、完全に新しいログインと見なし、新しいログインの数を 1 日 5 回に制限しますか? それは実現可能なアプローチでしょうか?

IP によるレート制限に関するこのユーザーのコメントを参照してください。

4

2 に答える 2

1

これはデータベースで追跡できますが、より軽量なソリューションは Memcached を使用して追跡することです。これにより、ログイン率を制限したり、特定の時間内にユーザーがアクセスできる一意の IP の数を制限したりするなど、他のことを行うことができます。

Memcached の優れた点は、指定した期間が経過するとレコードが自動的に期限切れになることです。データベース主導のアプローチでは、これを自分で行う必要があります。

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

于 2010-01-21T15:29:21.447 に答える
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

これが少し醜く、有効なコードでない場合は申し訳ありませんが、正しい方向に向けられることを願っています。

于 2010-01-21T16:06:36.170 に答える