Conceptul de „sesiuni“, bazate pe faptul că starea utilizatorului într-un fel conservat atunci când se mută de la o pagină la alta. Amintiți-vă că HTTP nu salvează statul, astfel încât numai browser-ul sau aplicația poate „aminti“ ceea ce aveți nevoie să vă amintiți.
În această lecție veți învăța despre sesiunile, cookie-urile și modul în care browser-ul de autentificare este construit în Sine. Ne uităm la modul de autentificare, de a crea propriile sale mâini, și cel mai frecvent utilizate pentru a autentifica o bijuterie - Concepe.
Puncte să reflecteze
Încercați să răspundă la întrebările furnizate. După atribuirea, încercați să le răspundă din nou
Cookie-uri, sesiuni, și Flash
Cookie-uri, sesiuni și Flash - trei obiectul special care vă oferă 4 șine, și care se comportă la fel ca hash-uri. Acestea sunt utilizate pentru a stoca date între cereri. Datele pot fi stocate până la următoarea cerere până când browser-ul este închis sau până când expiră de o anumită perioadă de pre-determinată de timp. În plus față de timpul de depozitare, diferența dintre aceste obiecte este faptul că fiecare dintre ele are propria domeniu specific de aplicare, care va fi rasskazno în continuare.
Cookie-urile - o „cheie-valoare“ perechi de tipul de date care sunt stocate în browserul utilizatorului, până la expirarea unei anumite perioade de timp. Acestea sunt aplicabile pentru aproape orice sarcină, dar de cele mai multe ori acestea sunt folosite pentru a menține utilizatorul în același loc o pagină web, în cazul în care pierde conexiunea la internet, sau pentru a stoca setări simple de afișare a site-ului. Le puteți stoca, de asemenea, în coșul de cumpărături de date sau parolele utilizatorului, dar nu este o idee bună, nu ar trebui să fie stocate într-o informație convențională de browser cookie care ar trebui să fie protejate sau salvate între sesiuni de browser. Utilizatorul poate pierde cu ușurință date, golirea memoriei cache, sau să fure / utilizarea datelor neprotejate din borcanul.
Pentru a lucra cu cookie-uri Rails vă oferă acces la un hash special numit cookie-uri. în care fiecare pereche cheie-valoare este stocată într-un cookie separat pentru browserul utilizatorului. Dacă, de exemplu, au păstrat cookie-uri [: hair-color] = "blonde". ai putea deschide instrumentele de dezvoltare în browser-ul și a vedea cookie-ul dvs. de utilizator cu o cheie de păr culoare și valoare blondă. Ștergeți-le pot folosi cookies.delete (: hair-culoare).
Cu fiecare nouă solicitare la server, browser-ul trimite toate cookie-urile, și le puteți accesa în controler și opiniile sale (vizualizări) ca un hash obișnuit. Puteti vedea, de asemenea, perioada de valabilitate, de exemplu, folosind următoarele cookie-uri de sintaxă [nume:] =
Un caz special - acest lucru este atunci când doriți să urmăriți un utilizator „sesiune“, care include tot ceea ce un utilizator face, până când doriți să „memoreze“ ea, de obicei, atâta timp cât utilizatorul închide fereastra browser-ului. În acest caz, fiecare pagină pe care un utilizator vizitat înainte de a închide browser-ul va fi parte a aceleiași sesiuni.
Pentru a identifica sesiunea de utilizator, Rails stochează browser-ul utilizatorului un seif special și protejate de modificările cookie-uri, care conține întreaga hash sesiune (în secțiunea „Resurse“, căutați-l în instrumente de dezvoltare în browser), și încetează să mai funcționeze atunci când browserul este închis. De fiecare dată când utilizatorul a depus o cerere la cererea dumneavoastră, cererea include automat cookie de sesiune (la fel ca restul cookie-uri), și îl puteți folosi pentru a urmări dacă utilizatorul este conectat. Acest lucru este acum poate părea abstractă, dar foarte curând veți vedea cum funcționează în practică.
Rails vă oferă acces la hash al „sesiune“ în același mod ca și „cookie“ un hash. Utilizați o variabilă sesiune în prezentările sau controlerele lor, astfel:
- și cookie-urile de sesiune nu sunt reale hashes, șinele pretinzând pur și simplu că este, pentru a face mai ușor de a lucra cu ei. Cu toate acestea, puteți citi hashes lor, pentru că ei se comportă foarte mult ca un hash reală.
- Cantitatea de date pe care le puteți stoca în cookie-uri de sesiune hash sau browser-ul este limitat (
4KB). Asta e suficient pentru orice scopuri „normale“, dar nu încerca să înlocuiască acest depozit de baze de date.
Deja ați văzut și folosit hash flash, dar ne vom uita la ea din nou, acum cu înțelegerea pozițiilor de sesiuni. Flash - este un hash special (bine, de fapt, o metodă care se comportă ca un hash), care stochează date de la o singură solicitare la alta. O puteți imagina ca un hash sesiune, care se autodistruge după deschidere. Acesta este folosit în general pentru a trimite mesaje de la operator la vizualizarea, astfel încât utilizatorul poate vedea mesaje despre trimiterea unui formular de succes (sau că formularul nu a reușit să trimită).
Dacă doriți să se afișeze mesajul „Vă mulțumim pentru abonare!“ browser-ul utilizatorului, după acțiunea lansată #create (care utilizează în mod obișnuit redirect_to pentru a trimite utilizatorului o nouă pagină în caz de succes), trimiteți acest mesaj despre abonament de succes? Nu puteți utiliza o variabilă locală (exemplu variabilă), deoarece provoacă redirecționa browser-ul să emită o nouă cerere HTTP, iar toate variabilele sunt pierdute.
Aici aveți sprijinul flash! Utilizați pentru a salva flash [: succes] (poate fi numit orice doriți), iar aceste date vor fi disponibile la prezentare până la următoarea cerere. Odată ce se va deschide prezentarea hash, Rails va șterge datele, adică, ele nu vor fi afișate atunci când utilizatorul se mută într-o nouă pagină. Este foarte inteligent și convenabil.
Cu toate acestea, trebuie să vă înregistrați mesajele de afișare flash în vizualizări. De obicei, în scris ajutor scurt, care afișează orice mesaj instantaneu disponibil (-iya) în partea de sus a ferestrei de browser. Puteți adăuga, de asemenea, o clasă de mesaj care se va adăuga posta orice CSS-stiluri, cum ar fi evidențiați: mesaje de succes în verde, și: eroare - roșu.
controlere filtre
Înainte să începem să vorbim despre autentificare, trebuie să rasssmotret filtre controlere. Esența acestor filtre este de a rula un cod într-un anumit moment, cum ar fi înainte de orice alt cod va funcționa. Acest lucru este important, deoarece, de exemplu, în cazul în care utilizatorul dorește să ruleze acțiunea, pentru care a avut nici un drept, trebuie să înăbușim acest lucru în cererea mugurilor și returnează eroarea corespunzătoare / redirecționare, înainte ca utilizatorul comite orice alt act. Pur și simplu pune, „filtra“ cereri nepotrivite.
Facem acest lucru prin utilizarea unui filtru de „înainte“, care ia ca argument numele metodei pe care vrem să curgă:
Metoda before_action ia un simbol al metodei care va fi executată înainte de orice alt cod în controler. Dacă se returnează false sau zero. Cererea nu va fi executat.
Aveți posibilitatea să atribuiți un filtru pentru o acțiune specifică cu ajutorul opțiunilor, v-ar numai. ca aceasta: before_action: require_login, numai: [: edita. actualizare]. Sau invers, dacă utilizați opțiunea: cu excepția. Filtrul funcționează pentru toate jocurile de acțiune, altele decât cele specificate.
Este mai bine să se ascundă metodele de filtrare în „privat“, astfel încât acestea sunt disponibile numai de la controller.
Și, în sfârșit, filtrele pot fi mostenite, deci, dacă doriți să aplicați un filtru shooter cu absolut toate controlerele, puneți-l în aplicație / controlere / fișier application_controller.rb.
autentificare
Scopul principal al autentificare - este de a se asigura că oricine încearcă să efectueze o acțiune, este eligibil. Modul standard de a gestiona acest proces este faptul că utilizatorul se conectează prin intermediul formularului de conectare. Odată ce utilizatorul a autentificat, urmăriți acțiunile sale ulterioare cu ajutorul sesiunilor, până când iese.
Basic și Digest Autentificare
Dacă aveți nevoie de o metodă simplă și nesigură autentificare, puteți utiliza autentificarea de bază HTTP. Nu vom discuta în detaliu aici, dar, în general, înseamnă să introduceți un nume de utilizator și parola într-o formă simplă și trimite-l (necriptat) prin rețea. Pentru această metodă scop #http_basic_authenticate_with (pentru exemple, a se vedea resurse suplimentare), și aceeași metodă de limitare a accesului la controlerele specifice pentru utilizatorii neautentificați.
Pentru un sistem de autentificare mai sigur (peste HTTP), folosind autentificare HTTP Digest. Din nou, noi nu suntem aici să-l picteze în detaliu. Ea se bazează pe începutul metodei prin #before_action și pe distanțe lungi de asteptare #authenticate_or_request_with_http_digest. care ia blocul pentru a reveni „true“ parola care trebuie furnizate.
Problema cu aceste metode este faptul că numele de utilizator și parolele sunt în mod explicit în controlerul (sau în altă parte), astfel încât acesta poate fi utilizat numai ca o soluție temporară.
Creați autentificarea dvs.
Dacă doriți, pentru a permite utilizatorilor să se conecteze la site-ul va trebui să efectueze mai multe acțiuni. Noi nu le va picta în detaliu, pentru că puteți face toate acestea, în practică. Cu toate acestea, unele dintre principiile este util să se știe. Ceea ce voi spune în continuare, poate părea un pic confuz si distrage atentia de la exemple din lumea reală, dar este de fapt doar o scurtă descriere a acestor piese pe care le va fi în curând integrate în proiectul dumneavoastră.
În primul rând, nu stochează parolele în baza de date sub formă de text. Procedând astfel, noi doar pentru a cere probleme (Pun pariu ca ai citit, de asemenea, știri despre site-urile piratate și parole scurgeri?). În schimb, vom păstra o versiune criptată a parolei ( „parola Digest“).
Atunci când un utilizator introduce parola în formularul de autentificare, mai degrabă decât să-l compare cu textul parolei direct, criptarea parolei. Apoi, va compara versiunea trunchiată a parolei de parola trunchiată stocate în baza de date. În cazul în care acestea se potrivesc, ați utilizatorul conectat.
Este mult mai bine, pentru că dacă vă aduceți aminte ce am discutat în lecția de siguranță în dezvoltare web 101 - o funcție hash-uri one-way. Puteți trunchiată cu ușurință text pentru parolă, dar foarte, foarte dificil să-l descifreze înapoi și de a restabili parola originală. Cel mai eficient mod de a sparge setul de hash-uri - este de a aduna o listă foarte mare de parole posibile, le hash și compara cu cei care încercați să crape (de exemplu, este o selecție masivă de parole).
Rails nu te obliga sa faci totul singur. Tu sunt prevăzute cu o metodă numită #has_secure_password. vă model simplu utilizator add-in, și se adaugă o serie de caracteristici care aveți nevoie. Pentru a lucra cu această metodă convenabilă vă nastraivate în atribute utilizator parola model de procesare și password_confirmation. dar nu salvați aceste valori într-o bază de date. Metoda has_secure_password de a interacționa cu valorile lor, transformându-le într-un hash.
Pentru a inițializa o nouă sesiune de utilizator (atunci când el se conectează), trebuie să creați un nou controler (de obicei, sessions_controller.rb) și dirijate spre corespunzătoare: nou. a crea și: distruge. În cazul în care utilizatorul furnizează numele de utilizator și parola corectă (și vom verifica acest lucru folosind metoda #authenticate), salvați ID-ul de utilizator în sesiune variabilă. care pot fi utilizate pentru a confirma faptul că utilizatorul este de fapt cel care sa prezentat. Acesta este un mod simplu de a autentifica un utilizator care utilizează infrastructura existentă a sesiunilor Rails, dar datele stocate în ea atâta timp cât există o sesiune.
Dacă utilizatorul dorește ca sa „amintesc“ (le-ați văzut, probabil, de o mie de ori pe caseta „Ține-mă minte“, in formularul de inscriere site-ul), aveți nevoie de o modalitate de a-l amintesc pentru o perioadă mai lungă decât durata sesiunii de browser. Va trebui să creați o altă coloană din tabelul de utilizatori, în cazul în care acesta va fi stocat pentru a face un remember_token criptat (tot ce se poate apela orice doriți). O să-l utilizați pentru a menține linia de întâmplare pentru acel utilizator, care va fi apoi folosite pentru a identifica.
De obicei, de ajutor pentru a avea mai multe metode de ajutor pentru rezolvarea unor sarcini comune: pentru a vă conecta utilizatorul pentru a vedea dacă acesta este conectat sau pentru a compara utilizatorul conectat la un alt utilizator (acest lucru vine la îndemână atunci când utilizatorul curent urmărește o pagină de la un alt utilizator, și nu ar trebui să vedeți referiri la „edita“) . Aceste lucruri vor face viața mai ușoară, deoarece puteți le reutilizați în controlere filtre pentru Vyuha sau chiar și în testele lor.
General Descriere pas:
- Adăugați utilizatori în coloană de tabel care va conține password_digest utilizator.
- Atunci când un utilizator semne sus, trunchiate parola, și de a salva versiunea trunchiată a noii coloane de baze de date prin metoda has_secure_password. Utilizatorul a adăugat la modelul.
- Nu uita necesitatea de a valida lungimea parolei și confirmați parola.
- Creați o sesiune de la un controler pentru (și corespunzătoare rutelor) și de a folosi metoda #authenticate. utilizatorul poate, după datele de conectare introduse datele corecte în formularul de înscriere.
- Utilizatorii memorezi crearea de coloana remember_token din tabelul de utilizatori și reține acest token ca un cookie permanent pe browser-ul utilizatorului. Resetabile-l la fiecare intrare nouă la site-ul.
- De fiecare dată când încărcați o pagină care necesită autentificare (și utilizarea #before_action în controlerul corespunzător) prima verificare a cookie-remember_token compara cu baza de date pentru a vedea dacă utilizatorul este deja conectat. Dacă nu, să-l redirecționați la pagina de conectare.
- Dacă este necesar, creați o metodă ajutătoare, care vă va permite să faci lucruri simple, cum ar fi stabili dacă utilizatorul este conectat sau pentru a compara utilizatorul curent la altul.
- Profit.
Conceapa - este o bijuterie care a fost creat pentru a face pentru tine toate cele de mai sus. S-ar putea dori să înceapă imediat studiile sale, dar acest lucru nu este o idee bună pentru începători. La început, imperativ pentru a înțelege aspectele de bază ale autentificare. Concepe poate fi, de asemenea, foarte dificil pentru tine, dacă aveți o problemă, care nu au soluții standard. În general, este bijuterie mai util pentru Rails dezvoltatorii de nivel mediu decât pentru începători.
În ciuda acestui fapt, în final veți folosi în cele mai multe dintre proiectele sale, după crearea propriului lor de autentificare maestru. Utilizați Concepe incomparabil mai bine decât pentru a construi autentificarea cu propriile lor mâini, pentru că rezolvă o mulțime de probleme și se închide gauri de securitate potențiale, pe care nu s-ar fi gândit chiar. Conceapa vă permite să interacționeze cu sistemele de autentificare mai avansate, în timp ce lucrează cu API-ul, cum ar fi OAuth. Prin urmare, mai târziu va fi foarte util pentru tine.
Pe scurt, Concepe vă oferă un set de formulare de înregistrare și de conectare la site-ul, precum și metode pentru punerea în aplicare a acestora. Se compune din 10 module (și puteți alege care va fi utilizat). Setați bijuterie „elaboreze“ și executați programul de instalare pentru a muta fișierele în aplicația dumneavoastră. Veți avea nevoie, de asemenea, pentru a rula migrarea bazei de date pentru a adăuga câmpuri suplimentare pentru a Utilizatorilor de masă.
sarcinile tale
concluzie
Această lecție ar trebui să vă dea o idee despre cât de complex poate fi un sistem de autentificare, dar el a avut, de asemenea, pentru a elimina patina de mister din site-urile mecanismele pe care le-au fost de o sută de ori. Autentificarea - nu este de rachete știință, este mult mai ușor, și în curând te va încorpora în aplicația dumneavoastră.
resurse suplimentare
Această secțiune include link-uri către materiale suplimentare. Acest lucru nu este în mod necesar, astfel le consideră ca fiind ceva util, dacă doriți să se scufunde mai adânc în tema