Modelul de securitate
Autentificarea („cine ești") și autorizarea („ce ai voie") sunt lucruri diferite, tratate în locuri diferite. Confuzia dintre ele produce fie găuri de securitate, fie cod încâlcit. Lecția asta clarifică modelul mental înainte de implementare.
Autentificare vs. autorizare
- Autentificare: verifici identitatea. Login, sesiune sau token, „ești logat?".
- Autorizare: verifici permisiunea. „Utilizatorul ăsta poate edita articolul ăsta?".
- Ordinea: întâi autentifici (401 dacă eșuează), apoi autorizezi (403 dacă eșuează).
Unde stă fiecare în Laravel
- Autentificare: middleware `auth`, guard-uri, `auth()->user()`.
- Autorizare: Gates și Policies, `$this->authorize()`, `@can`, `->can()`.
- Middleware `guest`: invers de auth (doar pentru neautentificați — pagini de login).
Straturi de apărare
Securitatea nu e un singur zid. Verifici la rută (middleware), la controller (authorize), și ascunzi în interfață (@can). Ascunderea în Blade e pentru experiență, NU pentru securitate — un utilizator poate oricând trimite cererea direct.
Ce vom construi
Un sistem complet: înregistrare cu verificare de email, login/logout, resetare parolă, roluri (admin/editor/user), permisiuni pe resurse (autorul își editează articolele), și acces la fișiere private.
Exercițiu
Pentru o aplicație la alegere, listează: ce rute necesită doar autentificare, ce rute necesită un rol anume, ce acțiuni necesită verificare pe resursă (owner). Marchează pentru fiecare codul de eroare corect (401 vs 403).
Greșeli frecvente
- Folosești 403 când ar trebui 401 (sau invers).
- Verifici permisiuni doar în Blade și crezi că e destul.
- Amesteci logica de „ești logat" cu „ai voie" în același if.
- Autorizezi înainte de a autentifica.
De reținut
- Autentificare = cine ești (401); autorizare = ce poți (403).
- auth middleware pentru prima, Gates/Policies pentru a doua.
- Verifici în mai multe straturi; Blade e doar pentru UX.
- Întâi autentifici, apoi autorizezi.
Pe scurt
Ține autentificarea și autorizarea separate, conceptual și în cod. Fiecare are locul ei, codul ei de eroare și stratul ei.