Sistema di autorizzazione che utilizza PHP e JS

7

Sto sviluppando una dashboard di amministrazione con aree diverse, in cui diversi utenti possono disporre di autorizzazioni diverse. Ad esempio:

  • Notizie
    • John: modifica, visualizza, aggiungi, rimuovi;
    • Carlos: modifica, visualizza;
    • Mario: -;
  • Supporto
    • John: view;
    • Carlos: modifica, visualizza;
    • Mario: modifica, visualizza, aggiungi, rimuovi;

Il modo in cui controllo questa autorizzazione è tramite array JSON, contenente ogni area e elenco di autorizzazioni. L'ho salvato nel mio database MySql (serializzato per primo) e anche sul localStorage. In questo modo posso controllare il frontend, ma anche fare una validazione finale sul lato server, tramite PHP.

Esempio JSON:

{
    "area": "news",
    "permission": [
        {"field": "access", "value": true},
        {"field": "read", "value": true},
        {"field": "edit", "value": true},
        {"field": "add", "value": true},
        {"field": "remove", "value": true}
    ]
},
{
    "area": "support",
    "permission": [
        {"field": "access", "value": true},
        {"field": "read", "value": true},
        {"field": "edit", "value": false},
        {"field": "add", "value": false},
        {"field": "remove", "value": false}
    ]
},
...

Ho dubbi su questo sistema perché, in primo luogo, non ho mai fatto nulla di simile e non ho trovato alcun esempio, quindi non so se questo è il modo corretto per farlo. Inoltre, lo sto memorizzando come JSON perché ci sono utenti admin che hanno bisogno di modificare (con checkbox) queste autorizzazioni, quindi è più facile visualizzarlo sul frontend.

Ma sono molto aperto a cambiare questo metodo sulla base di altri criteri che ritieni sia meglio. Voglio solo avere la sicurezza prima e anche facile da mantenere.

    
posta celsomtrindade 28.12.2016 - 16:07
fonte

2 risposte

3

Dichiarazione di non responsabilità: non sono un esperto di questi argomenti, sto solo condividendo il modo in cui io e il mio senior stiamo facendo il nostro progetto attuale.

Database:

Il tuo design sembra abbastanza solido, ma penserei a come tenere queste autorizzazioni in una tabella.

diciamo che abbiamo una tabella users

user_id | name | password
-------------------------
      0 | John |     ****

Riesco a vedere 2 possibili modi in cui estendere il nostro database per conservare queste autorizzazioni.

Puoi aggiungere colonne di autorizzazione che indicano cosa può fare ciascun utente

user_id | name | password| perm1 | perm2 | ... |permn
------------------------------------------------------
      0 | John |     ****|     Y |     N |     |    Y

Ciò comporterà avere un sacco di colonne e un design disordinato. dal lato positivo avrete la granularità per dettare esattamente ciò che si può e non si può fare.

Puoi tuttavia aggiungere il concetto di roles al tuo progetto.

Puoi creare una tabella roles , definire i tipi di ruoli utente (e il tipo di autorizzazioni che forniscono) nella tua applicazione e assegnare semplicemente a ciascun utente un ruolo

user_id | name | password|  role_id
-----------------------------------
      0 | John |     ****|        1

E la tabella roles

role_id | role_name  | perm1 |....| permn
----------------------------------------
      0 | Admin      |     Y |    |    Y
      1 | Regular    |     N |    |    Y

In questo modo crei una separazione delle preoccupazioni per la tua tabella utenti, invece di inserire tutti i tuoi dati utente in una tabella che potrebbe aumentare nel tempo (la gestione di dozzine di colonne in una tabella non è divertente), puoi posizionare un utente pertinente separato dati su più tabelle. manterrà anche le vostre domande brevi.

(Questo è simile a come le applicazioni Web Java forniscono privilegi / permessi a gli utenti )

PHP:

Per la tua vista client, puoi tenere un oggetto sessione che descrive l'utente corrente, puoi usare il valore role per dire ai tuoi script php quali parti dei tuoi modelli vuoi generare per il tuo utente.

Esempio (lama):

@if (user($role) === 'admin')
    <button id="dontclickme">History eraser button</button>
@endif
    
risposta data 29.12.2016 - 10:52
fonte
0

Quindi, la tua implementazione per il front-end non mi sembra male. Potresti voler pensare a come utilizzerai le autorizzazioni con js in modo specifico, e vedere se sei soddisfatto della struttura di JSON basata su questo.

WRT al back-end, cerco di non memorizzare JSON direttamente nel db. Se devi eseguire qualsiasi lavoro su questi dati direttamente tramite il db, sarà molto inefficiente, specialmente con l'aumentare del numero di utenti.

In generale, con qualcosa di simile, vorrei prima vedere se trovi qualcosa che si adatta alle tue esigenze in compositore . Se non lo fai, potresti voler esaminare alcuni pacchetti e vedere se puoi trovare qualche ispirazione se hai dei dubbi sulla tua implementazione.

    
risposta data 28.12.2016 - 16:59
fonte

Leggi altre domande sui tag