Cum gestionati permisiunie unui user?

Pare o intrebare banala.
Am un proiect in care gestionam permisiunile userilor pe nivele, avem o coloana in baza de date pentru nivel, iar din cod am setat userii cu nivelul 1 au permisiunile x, userii de nivel 2 permisiuni y, etc.

Ma gandesc sa trec la permisiuni specifice pentru fiecare user in parte. Intr-un final vreau ca in interfata de administrare sa pot afisa usor toti userii care au permisiunea x, iar cand modific permisiunile unui user sa pot bifa pentru fiecare user individual ce permisiuni va avea.

Acum intrebarea mea este cum stochez in baza de date permisiunile astfel incat sa fie usor de citit si modificat ?

  1. Cate un camp pentru fiecare permisiune in parte. Asa e foarte usor de cautat, verificat si modificat, dar ar fi cam aglomerat cand voi avea nevoie de 10-20 permisiuni.
  2. Un camp permisiuni in care pun permisiunile separate de virgula.
  3. JSON ? E usor de citit cu un simplu json_decode in php, dar e mai greu de cautat.
  4. Ma pot complica mai mult cu un alt tabel in baza de date care contine permisiunile, o descriere pentru fiecare permisiune, si apoi la user sa stochez idurile permisiunilor din acel tabel, despartite de virgula.

Varianta 1 este cea mai simpla dar mi-e ca la 20 de permisiuni nu o sa fie prea bine, nu pare bine.
Voi cum faceti ?

Cu 2 și 3 vei avea o bază profund ne-normalizată. La o primă vedere, eu aș merge pe prima variantă: o tabelă cu o coloană pentru fiecare permisiune.

1 Like

Eu le tin de obicei… cam asa:

1. users
- id_user
- username

2. permissions
- id_permision
- name
- description

3. users_permisions
- id_user
- id_permision
6 Likes

Ti-as recomanda cateva lucruri cand lucrezi cu tabele:

  • denumirea tabelului sa fie singulara - Singular vs Plural Names
  • foloseste conventii de denumiri familiare, ex. API JSON format:
    • { "name_width_dash": "2" } vs { "pModerare": "2" }
  • as recomanda sa mergi pe denumiri in Engleza, romgleza produsa de mix-ul de cuvinte Romana / Engleza nu produce cel mai intuitiv cod (in opinia mea)
foreach ($nomenclator as $persoana) {
  $loginClient[] = $tmpl->setInput($persoana['username']);
}

username fiind in engleza nu stii daca a fost adaugat ulterior prin cod sau a fost extras din DB, iar daca traduci username in alias este si mai neintuitiv.

3 Likes

de ce nu ai trece pe grupuri de acces?
setezi intr-o tabela grupurile de acces existente
setezi in alta tabela paginile/actiunile existente
setezi in alta tabela legatura dintre useri si grupurile de acces (ce user, din ce grup face parte)
setezi in a 4-a tabela legatura dintre pagini si grupurile existente (ce pagina/actiune din ce grup face parte)
in php faci o functie si verifici in ea daca si userul si pagina/actiunea au 1 grup de acces comun, atunci userul are acces la acea pagina

m-am inspirat din phpbb cand am facut trecerea de la nivele la grupuri de acces si mi se pare mult mai ok si flexibil (aveam mari limitari si probleme la varianta anterioara pe nivele cum ai si tu acum)

@GeorgeJipa E bine asa pentru ca e oarecum dinamic. Nu trebuie sa modifici cod existent ca sa adaugi o permisiune. Dar asta inseamna ca la fiecare request trebuie sa fac inca doua query-uri in db pentru a verifica permisiunile unui singur user.

@navaru In legatura cu denumirea la plural/singular, asta nu stiam, pana acum am denumit mereu la plural. Cred ca de acum in colo voi denumi la singular. Mersi.
Cat despre denumirile de genul “pModerare”, pai cam tot proiectul l-am facut cu denumiri de genul, prea tarziu sa redenumesc, dar, da, mai clare sunt denumirile complete cu “_”.

@Birkoff Mi se pare mult prea complex pentru ce am nevoie.

Cred ca varianta 1 ramane cea mai ok pentru proiectul respectiv.
Multumesc pentru raspunsuri.

Nu-i nevoie sa faci un query la fiecare afisare, ci o singura data… apoi lista de permisiuni a user-ului se poate cache-ui. :wink:

WTF? Ce nu știai? Că există niște oameni cărora li se pare normal să zică “sacoșă de măr” în loc de “sacoșă de mere”, respectiv “tabel de utilizator” în loc de “tabel de utilizatori”, și că ăia ar putea să se voteze între ei, dând astfel un aparent aer de legitimitate unui răspuns de pe “StackWhatever”?
Citește toate răspunsurile și comentariile și-ai să vezi că sunt cel puțin tot atâția oameni care susțin forma de plural. Pe lângă asta, nu vezi și singur cât de puerile sunt motivele pe care le dă? Chiar așa de ușor ești de influențat?
Printre cei ce susțin pluralul este unul care dă ca argument chiar un standard ISO din care ar reieși că pluralul este forma ce-ar trebui folosită…

ONTOPIC
Răspunsul lui @GeorgeJipa este fix ce-ar trebui să faci și tu cu observația că renunțarea la tabelul permissions îți va oferi o și mai mare flexibilitate (logica aplicației este controlată numai din cod, nefiind necesară introducerea unui rând nou în baza de date ori de câte ori introduci un nou nivel de permisiuni).

2 Likes