Implementering van "Onthou my" in 'n Rails-toepassing
-
08-06-2019 - |
Vra
My Rails-app het 'n aantekenblokkie met 'n "onthou my"-merkblokkie.Gebruikers wat daardie blokkie merk, moet aangemeld bly selfs nadat hulle hul blaaier gesluit het.Ek hou tred of gebruikers aangemeld is deur hul ID in die gebruiker se sessie te stoor.
Maar sessies word in Rails geïmplementeer as sessiekoekies, wat nie aanhoudend is nie.ek kan maak hulle aanhoudend:
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 dit lyk soos 'n hack, wat verbasend is vir sulke algemene funksionaliteit.Is daar 'n beter manier?
Wysig
Gareth se antwoord is redelik goed, maar ek sal steeds 'n antwoord wil hê van iemand wat vertroud is met Rails 2 (omdat dit uniek is CookieSessionStore
).
Oplossing
Ek het 'n rukkie hieroor nagedink en tot 'n paar gevolgtrekkings gekom.Rails-sessiekoekies is by verstek peuterbestand, so jy hoef regtig nie bekommerd te wees dat 'n koekie aan die kliëntkant gewysig word nie.
Hier is wat ek gedoen het:
- Sessiekoekie is ingestel om langlewend te wees (6 maande of so)
- Binne die sessiewinkel
- 'n 'verval op'-datum wat gestel is op aanmeld + 24 uur
- gebruiker ID
- Geverifieer = waar sodat ek anonieme gebruikersessies kan toelaat (nie gevaarlik as gevolg van die koekie-peuterbeskerming nie)
- Ek voeg 'n before_filter by in die toepassingsbeheerder wat die 'verval op' deel van die sessie kontroleer.
Wanneer die gebruiker die "Onthou my" blokkie merk, stel ek net die sessie[:vervaldatum] datum om aan te meld + 2 weke.Niemand kan die koekie steel en vir ewig aangemeld bly of hom as 'n ander gebruiker voordoen nie, want die rails-sessie-koekie is peutervry.
Ander wenke
Jy behoort byna beslis nie die sessiekoekie uit te brei om lank te lewe nie.
Alhoewel dit nie spesifiek met relings te doen het nie Hierdie artikel gaan tot 'n mate om 'onthou my'-beste praktyke te verduidelik.
Opsommend moet jy egter:
- Voeg 'n ekstra kolom by die gebruikerstabel om 'n groot ewekansige waarde te aanvaar
- Stel 'n langlewende koekie op die kliënt wat die gebruiker-ID en die ewekansige waarde kombineer
- Wanneer 'n nuwe sessie begin, kyk vir die bestaan van die ID/waarde-koekie en verifieer die nuwe gebruiker as hulle ooreenstem.
Die skrywer beveel ook aan om die ewekansige waarde ongeldig te maak en die koekie terug te stel by elke aanmelding.Persoonlik hou ek nie daarvan nie aangesien jy dan nie op twee rekenaars by 'n werf aangemeld kan bly nie.Ek is geneig om seker te maak dat my wagwoordveranderende funksie ook die ewekansige waarde terugstel en sodoende sessies op ander masjiene uitsluit.
As 'n laaste opmerking, is die raad wat hy gee oor die maak van sekere funksies (wagwoordverandering/e-posverandering, ens.) onbeskikbaar vir outo-geverifieerde sessies die moeite werd om te volg, maar word selde in die regte wêreld gesien.
Ek stel voor dat jy óf kyk na die RESTful_Authentication-inprop, wat 'n implementering hiervan het, óf net jou implementering verander om die RESTful Authentication_plugin te gebruik.Daar is 'n goeie verduideliking oor hoe om hierdie inprop by Railscasts te gebruik:
railscasts #67 rustige_verifikasie
Hier is 'n skakel na die inprop self
Die restful_authentication-inprop het 'n goeie implementering hiervan:
http://agilewebdevelopment.com/plugins/restful_authentication
Let daarop dat jy nie hul sessie wil volhou nie, net hul identiteit.Jy sal 'n nuwe sessie vir hulle skep wanneer hulle na jou werf terugkeer.Oor die algemeen ken jy net 'n GUID aan die gebruiker toe, skryf dit aan hul koekie en gebruik dit dan om hulle op te soek wanneer hulle terugkom.Moenie hul aanmeldnaam of gebruikers-ID vir die teken gebruik nie, aangesien dit maklik geraai kan word en listige besoekers toelaat om ander gebruikers se rekeninge te kaap.
Dit is 'n redelike goeie opskrif van een ouens se ervaring met die skep van 30-dae aanhoudende sessies.
WAARSKUWING:blogpos is van 2006
http://grahamglass.blogs.com/main/2006/05/rails_sessionsr.html
Dit het vir my soos 'n sjarme gewerk:
http://squarewheel.wordpress.com/2007/11/03/session-cookie-expiration-time-in-rails/
Nou verval my CookieStore-sessies na twee weke, waardeur die gebruiker weer hul aanmeldbewyse moet indien om vir nog twee weke aanhoudend ingeteken te wees.
Basies is dit so eenvoudig soos:
- insluitend een lêer in die verkoper / plugins gids
- stel sessie-vervalwaarde in toepassingbeheerder met net een reël
Ek sal vir Devise gaan vir 'n briljante verifikasie-oplossing vir relings.