2010-01-21 1 views
0

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

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

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

Мысли?

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

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

ответ

1

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

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

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

+0

Спасибо за головы, но как бы это реализовать? Пример, который вы указали, представляет собой ограничение скорости для определенного IP; Я бы хотел сделать это на моей модели User ...? – neezer

+0

Вы можете отслеживать идентификатор пользователя точно так же, как IP, или, возможно, комбинацию обоих. – tadman

+0

Чтение вашего редактирования выше, я думаю, вы можете отслеживать количество уникальных сеансов на пользователя в день или что-то в этом роде. – tadman

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 

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

+0

Спасибо, но похоже, что это может помешать тому, что Authlogic уже делает (не уверен, но я действительно не хочу беспокоить Authlogic, если это возможно). Любые мысли о моем вопросе выше? – neezer