Rails: ограничение ежедневного количества пользователей для входа в систему по IP-адресу? - PullRequest
0 голосов
/ 21 января 2010

Есть ли способ ограничить доступ пользователя к входу, скажем, только 5 IP-адресами в день? Так что если бы учетная запись пользователя пыталась войти в тот же день с 6-го другого IP-адреса, им было бы отказано. Однако я бы хотел, чтобы это ограничение было сброшено в конце дня.

Если Authlogic не предоставляет способ отследить это из коробки, какие у вас есть идеи о том, как мне это реализовать? Как вы, вероятно, можете сказать, я уже использую Authlogic для аутентификации.

Моя главная цель - ограничить возможность моего пользователя делиться своим логином с незарегистрированным пользователем; Я знаю, что IP-адрес большинства людей периодически меняется в течение дня, потому что вряд ли у кого-то есть личный статический IP-адрес, но я думаю, что 5 - это достаточное количество разрешений, даже если учесть, что пользователь может посетить мой сайт на своем iPhone или в Starbucks и др.

Мысли

ОБНОВЛЕНИЕ: После прочтения многих комментариев по ссылке, предоставленной @tadman, я думаю, что было бы более полезно ограничить количество новых сеансов, созданных на машине, у которой их не было. ранее вместо IP-адреса. Если я понимаю, как работает Authlogic, верно, сеансы представляют собой комбинацию записей на стороне сервера и файла cookie в браузере пользователя. Если я "выйду" из своего сайта, cookie все еще будет в моем браузере, не так ли? Просто с истекшим значением или что-то в этом роде. Могу ли я проверить это? Так что, если бы на компьютере, который вообще не имел этого cookie, я бы считал полностью NEW вход в систему, и я бы ограничил количество новых входов в систему до 5 в день? Будет ли это осуществимым подходом?

См. Комментарии этого пользователя об ограничении скорости по IP, чтобы понять, что я имею в виду: http://simonwillison.net/2009/Jan/7/ratelimitcache/#c43031

Ответы [ 2 ]

1 голос
/ 21 января 2010

Хотя вы можете отслеживать это в базе данных, более легким решением является отслеживание этого с использованием Memcached. Это позволяет вам делать другие вещи, такие как ограничение скорости входа в систему и ограничение количества уникальных IP-адресов, с которых человек может посещать в течение определенного времени.

Приятной особенностью Memcached является то, что она автоматически истекает записи через определенный промежуток времени. При использовании подхода на основе базы данных вам придется делать это самостоятельно.

Пример: http://simonwillison.net/2009/Jan/7/ratelimitcache/

0 голосов
/ 21 января 2010

Я бы, вероятно, создал таблицу под названием сеансы, которая содержит 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

Извините, если это немного некрасиво и недопустимый код, но, надеюсь, он укажет вам правильное направление.

...