Domanda

Ho iniziato a sviluppare un'applicazione forum in PHP sul mio framework MVC e ho alla fase in cui I permessi di assegnare ai membri. (Per esempio: leggere, scrivere, UPDATE, DELETE)

Ora, so che posso aggiungere 5 colonne sotto il tavolo dell'utente nel mio database e li misi a 1 | 0, ma che a me sembra troppo se voglio aggiungere altre regole, come muoversi per esempio.

E come posso assegnare dinamicamente questi li privilegi per gli utenti singolarmente?

Ho sentito di usare un bitmasks, ma sarebbe davvero bello se potessi comprendere appieno loro prima di continuare.

Avete un esempio di come potrei implementare questo?

È stato utile?

Soluzione

Il metodo che hai descritto - singoli privilegi archiviati in colonne -. È semplice a spese di flessibilità (come avete notato)

Il metodo di Zuul è ancora più semplice ed essenzialmente uguali ai suoi, tranne che evita la necessità di eventuali dichiarazioni "ALTER TABLE". Tuttavia, non è normalizzata, non facilmente interrogabile e non auto-documentazione.

Un altro problema con entrambi questi metodi è che la vostra base di utenti cresce, lo troverete sempre più di un dolore per mantenere i privilegi di tutti impostati correttamente. Vi troverete con un sacco di utenti che hanno bisogno esattamente gli stessi privilegi. Eppure, al fine di modificare i privilegi di un utente, tale da accogliere un nuovo privilegio, si dovrà andare in e aggiungere che il privilegio di ogni utente che ha bisogno individualmente. Maggiore PITA.

Per un forum, non è probabile che avrete bisogno di ogni singolo utente la gestione dei privilegi. Più probabilmente avrete alcune categorie di utenti come utenti anonimi, gli utenti registrati, moderatori, amministratori, ecc In questo modo sarebbe particolarmente adatto per il controllo di accesso basato sui ruoli (RBAC). In questo sistema si desidera assegnare ad ogni utente a un ruolo, e concedere i privilegi al ruolo. Privilegi sarebbero memorizzati come righe di una tabella "privilegio". così lo schema del database semplificata sarà simile:

PRIVILEGE
int id (primary key)
varchar description

ROLE_PRIVILEGE_JOIN
privilege_id (foreign key)
role_id (foreign key)

ROLE
int id (primary key)
varchar description

USER
int id (primary key)
int role_id (foreign key)

Questo modello è utilizzato in molte applicazioni che si occupano con i privilegi dell'utente. Aggiungere tutti i privilegi che chiunque potrebbe avere come una riga nella tabella dei privilegi; aggiungere tutti i ruoli che ogni utente potrebbe avere nella tabella ruolo; e collegarli in modo appropriato nella tabella role_privilege_join.

L'unico vero svantaggio è che perché un join tavolo viene utilizzato, il "CAN utente X fanno Y" richiesta sta per essere un po 'più lento.

Altri suggerimenti

Un autorizzazioni maschera di bit si comprende meglio se rappresentato come binario, con ogni cifra rappresenta un permesso di essere acceso o spento. Quindi, se le autorizzazioni X, Y e Z esistono, e ho solo l'accesso a X e Z, 101 rappresenterebbe che ho al primo e terzo autorizzazioni concesse a me, ma non il secondo. Il numero 101 binario è equivalente al numero decimale 5, in modo che è quello che finirebbe memorizzate nel database. Un unico, piccolo numero intero è un oggetto molto più efficiente al deposito di una stringa o più piccoli interi.

Modifica ho capito quanto fosse facile funzioni di conversione esistenti leva per ottenere una piuttosto veloce implementazione in corso. Ecco un esempio.

<?php
function bitmask_expand($n) {
  // 9 returns array(1, 0, 0, 1)
  return str_split(base_convert($n, 10, 2));
}

function bitmask_compact($a) {
  // array(1, 0, 0, 1) returns 9
  return (int) base_convert(implode($a), 2, 10);
}

$ns = range(0, 7);
foreach($ns as $n) {
  print_r($b = bitmask_expand($n));
  echo bitmask_compact($b), "\n\n";
}

Si potrebbe ottenere prestazioni migliori se si utilizzano cicli, piuttosto che tirare indietro da e per le stringhe, ma questo illustra il principio abbastanza chiaramente.

I creerebbe una tabella denominata "ruoli":

CREATE TABLE Roles(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY(id),
 rolename VARCHAR(30))

Stick qualunque autorizzazioni che si desidera in là. Quindi creare una tabella denominata "UserRoles" per gli utenti di collegamento ai ruoli:

CREATE TABLE UserRoles(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY(id),
 UserId INT,
 RoleID INT)

Un sacco di flessibilità e facile da costruire su (cioè il flusso di lavoro, regole, ecc) (Vorrei aggiungere chiavi esterne così)

Non c'è bisogno di complicare questo, basta usare un campo "ex: autorizzazioni" e fare qualcosa di simile:

  

$ permessi = "1; 1; 0; 1";

     

dove la vostra preoccupazione si legge:

     

LEGGI - 1 (can)

     

WRITE - 1 (can)

     

UPDATE - 0 (non può)

     

DELETE - 1 (can)

poi, durante il controllo, basta usare "esplodere" da ";" ...

In questo modo, si può sempre applicare tipi più autorizzazioni senza cambiare il tuo tavolo ... così si ottiene il tavolo più piccolo, e la query più velocemente!

E 'una soluzione per il vostro problema:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top