Implementacja "Remember me" w aplikacji Rails

Moja aplikacja Rails ma pole logowania z pole wyboru "Zapamiętaj mnie". Użytkownicy, którzy zaznaczą to pole, powinni pozostać zalogowani nawet po zamknięciu przeglądarki. Śledzę, czy użytkownicy są zalogowani, przechowując swój identyfikator w sesji użytkownika.

Ale sesje są zaimplementowane w Rails jako sesyjne pliki cookie, które nie są trwałe. I can make them persistent:

class ApplicationController < ActionController::Base
  before_filter :update_session_expiration_date

  private

  def update_session_expiration_date
    options = ActionController::Base.session_options
    unless options[:session_expires]
      options[:session_expires] = 1.year.from_now
    end
  end
end

Ale to wygląda jak hack, co jest zaskakujące dla tak wspólnej funkcjonalności. Czy jest coś lepszego sposób?

Edit

Odpowiedź Garetha jest całkiem dobra, ale i tak chciałbym otrzymać odpowiedź od kogoś, kto zna Rails 2 (ponieważ jest unikalny CookieSessionStore).

Author: coder-croc, 2008-08-02

8 answers

Trochę nad tym myślałem i doszedłem do pewnych wniosków. Pliki cookie sesji Rails są domyślnie zabezpieczone przed manipulacją, więc naprawdę nie musisz się martwić, że plik cookie zostanie zmodyfikowany po stronie klienta.

Oto co zrobiłem:

  • plik cookie sesji jest ustawiony na długotrwały (około 6 miesięcy)
  • wewnątrz sklepu sesji
    • Data "wygasa w dniu", która jest ustawiona na logowanie + 24 godziny
    • identyfikator użytkownika
    • uwierzytelniony = true, więc mogę pozwolić na anonimowe sesje użytkownika (nie niebezpieczne ze względu na ochronę przed cookie)
  • dodaję before_filter w kontrolerze aplikacji, który sprawdza część' expires on ' sesji.

Gdy użytkownik zaznaczy pole "Zapamiętaj mnie", ustawiam datę sesji [: expireson] na login + 2 tygodnie. Nikt nie może ukraść pliku cookie i pozostać zalogowanym na zawsze lub udawać innego użytkownika, ponieważ plik cookie sesji rails jest odporny na manipulacje.

 11
Author: Daniel Beardsley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 21:37:36

Prawie na pewno nie powinieneś przedłużać sesji cookie, aby były długotrwałe.

Chociaż nie zajmuje się konkretnie rails Ten artykuł jest trochę obszerny, aby wyjaśnić najlepsze praktyki "remember me".

W podsumowaniu powinieneś:

  • dodaj dodatkową kolumnę do tabeli użytkownika, aby zaakceptować dużą losową wartość
  • Ustaw długotrwały plik cookie na kliencie, który łączy identyfikator użytkownika i losową wartość
  • gdy rozpocznie się nowa sesja, sprawdź za istnienie pliku cookie id/value i uwierzytelnienie nowego użytkownika, jeśli pasują.

Autor zaleca również unieważnienie losowej wartości i zresetowanie pliku cookie przy każdym logowaniu. Osobiście nie podoba mi się to, ponieważ nie możesz być zalogowany na stronie na dwóch komputerach. Chciałbym mieć tendencję do upewniania się, że moja funkcja zmiany hasła również resetuje losową wartość, blokując w ten sposób sesje na innych maszynach.

Na koniec rada, którą daje przy wykonywaniu pewnych funkcji (zmiana hasła/Zmiana adresu e-mail itp.) niedostępne dla automatycznych uwierzytelnionych sesji jest warte śledzenia, ale rzadko spotykane w świecie rzeczywistym.

 27
Author: Gareth Simpson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-02 16:10:42

Sugerowałbym, abyś albo spojrzał na wtyczkę RESTful_Authentication, która ma implementację tego, albo po prostu przełączył swoją implementację na RESTful Authentication_plugin. Jest dobre wyjaśnienie jak używać tej wtyczki w Railscasts:

Railscasts # 67 restful_authentication

Oto link do samej wtyczki

Restful_authentication

 9
Author: Mattew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-27 11:36:27

Plugin restful_authentication ma dobrą implementację tego:

Http://agilewebdevelopment.com/plugins/restful_authentication

 5
Author: Jarin Udom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-06 21:30:25

Zauważ, że nie chcesz utrzymywać ich sesji, tylko ich tożsamość. Utworzysz dla nich nową sesję, gdy powrócą do twojej witryny. Zazwyczaj po prostu przypisujesz użytkownikowi identyfikator GUID, zapisujesz go do jego pliku cookie, a następnie używasz go do wyszukania ich, gdy wrócą. Nie używaj ich nazwy logowania lub identyfikatora użytkownika jako tokena, ponieważ można go łatwo odgadnąć i pozwolić sprytnym odwiedzającym przejąć konta innych użytkowników.

 3
Author: Teflon Ted,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-01 21:46:46

Jest to całkiem dobry zapis jednego faceta doświadczenia tworzenia 30-dniowe sesje trwałe.

WARNING: blog post is from 2006

Http://grahamglass.blogs.com/main/2006/05/rails_sessionsr.html

 3
Author: engtech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-02 00:57:54

Wybrałbym Devise dla genialnego rozwiązania uwierzytelniającego dla rails.

 3
Author: Ved,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-16 04:26:53

To działało jak urok dla mnie:

Http://squarewheel.wordpress.com/2007/11/03/session-cookie-expiration-time-in-rails/

Teraz moje sesje CookieStore wygasają po dwóch tygodniach, przy czym użytkownik musi ponownie podać swoje dane logowania, aby być wytrwale zalogowanym przez kolejne dwa tygodnie.

Bascially, it ' s as simple as:

  1. w tym jeden plik w katalogu vendor/plugins
  2. ustawia wartość wygaśnięcia sesji w kontrolerze aplikacji użycie tylko jednej linii
 2
Author: Allan L.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-20 08:58:47