Implementatie van "Remember me" in een Rails applicatie

stemmen
46

Mijn Rails-app heeft een bord in doos met een onthoud mij checkbox. Gebruikers die controleren dat vak moet je ingelogd blijven zelfs na het sluiten van de browser. Ik ben het bijhouden van of gebruikers ingelogd bent door de opslag van hun id in de sessie van de gebruiker.

Maar sessies worden in Rails geïmplementeerd als sessie-cookies, die niet persistent zijn. Ik kan maken ze 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

Maar dat lijkt een hack, wat verrassend is voor een dergelijke gemeenschappelijke functionaliteit. Is er een betere manier?

Bewerk

Gareth antwoord is vrij goed, maar ik zou toch graag een antwoord van iemand die vertrouwd is met Rails 2 (vanwege de unieke CookieSessionStore).

De vraag is gesteld op 02/08/2008 om 13:56
bron van user
In andere talen...                            


8 antwoorden

stemmen
26

Je moet vrijwel zeker niet worden verlenging van de sessie-cookie lang om geleefd te worden.

Hoewel niet specifiek betrekking heeft op rails dit artikel gaat om wat lengte te leggen 'remember me' best practices.

Samengevat al moet u:

  • Voeg een extra kolom aan de gebruiker tafel om een ​​grote willekeurige waarde te accepteren
  • Stel een lang geleefd cookie op de client die de gebruikers-ID en de willekeurige waarde combineert
  • Wanneer een nieuwe sessie start, te controleren op de aanwezigheid van de id / waarde cookie en authenticiteit van de nieuwe gebruiker of ze overeenkomen.

De auteur beveelt ook ongeldig maken van de willekeurige waarde en het resetten van de cookie bij elke login. Persoonlijk geloof ik niet vind dat als je dan kan niet blijven bij een site ingelogd op twee computers. Ik zou de neiging om ervoor te zorgen dat mijn wachtwoord veranderen functie ook de willekeurige waarde dus vergrendelen out sessies op andere machines te resetten.

Als een laatste opmerking, het advies dat hij geeft op het maken van bepaalde functies (wachtwoord wijzigen / email change etc) niet beschikbaar is voor auto geauthenticeerde sessies is de moeite waard volgende opties, maar zelden gezien in de echte wereld.

antwoordde op 02/08/2008 om 17:10
bron van user

stemmen
3

Dit is een vrij goede write-up van één jongens ervaring met het creëren van 30 dagen hardnekkig sessies.

WAARSCHUWING: blog post is vanaf 2006

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

antwoordde op 03/08/2008 om 02:53
bron van user

stemmen
5

De restful_authentication plugin heeft een goede uitvoering van deze:

http://agilewebdevelopment.com/plugins/restful_authentication

antwoordde op 06/08/2008 om 22:30
bron van user

stemmen
3

Merk op dat je niet willen dat hun sessie, maar hun identiteit aanhouden. Je hebt een nieuwe sessie voor hen te creëren wanneer ze terugkeren naar uw site. Over het algemeen je gewoon een GUID aan de gebruiker toe te wijzen, schrijven dat hun koekje, gebruik het dan om ze te zoeken wanneer ze terugkomen. Niet hun login naam of gebruikers-ID niet gebruiken voor de token als het gemakkelijk kan worden geraden en laat geslepen bezoekers naar accounts van andere gebruikers te kapen.

antwoordde op 01/09/2008 om 22:46
bron van user

stemmen
10

Ik heb een tijdje doorgebracht na te denken over deze en kwam tot een aantal conclusies. Rails session cookies zijn fraudebestendige standaard, zodat je echt geen zorgen te maken over een cookie wordt gewijzigd op de client einde.

Hier is wat ik heb gedaan:

  • Sessie cookie wordt ingesteld met een lange levensduur te zijn (6 maanden of zo)
  • Binnen de sessie op te slaan
    • Een 'vervalt op' date die is ingesteld om in te loggen + 24 uur
    • gebruikersnaam
    • Geauthenticeerd = true, zodat ik kan zorgen voor anonieme gebruiker sesssions (niet gevaarlijk, omdat van de cookie bescherming tegen sabotage)
  • Ik voeg een before_filter in de Application Controller die controleert de 'vervalt op' deel van de sessie.

Wanneer de gebruiker de "Remember Me" box controleert, ik stel gewoon de sessie [: expireson] nader te bepalen datum in te loggen + 2 weken. Niemand kan het cookie stelen en blijf voor altijd inlogt of zich voordoen als een andere gebruiker, omdat de rails sessie cookie is geknoeid.

antwoordde op 16/09/2008 om 22:37
bron van user

stemmen
9

Ik stel voor dat je ofwel een kijkje nemen op de RESTful_Authentication plug in, dat een uitvoering van deze heeft, of gewoon schakel uw uitvoering aan de REST Authentication_plugin gebruiken. Er is een goede uitleg over hoe dit te gebruiken plug-in op Railscasts:

Railscasts # 67 restful_authentication

Hier is een link naar de plugin zelf

restful_authentication

antwoordde op 17/09/2008 om 15:17
bron van user

stemmen
2

Dit werkte als een charme voor mij:

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

Nu is mijn CookieStore sessies vervallen na twee weken, waarbij de gebruiker zijn inloggegevens opnieuw moeten indienen om te voortdurend ingelogd-in voor nog eens twee weken.

Bascially, het is zo simpel als:

  1. waaronder een bestand in vendor / plugins directory
  2. Set sessie tijdverstrijkingswaarde in toepassing controller met slechts één regel
antwoordde op 20/09/2008 om 09:58
bron van user

stemmen
3

Ik zou gaan voor te ontwikkelen voor een briljante authenticatie oplossing voor rails.

antwoordde op 16/01/2011 om 05:26
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more