Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Gestire permessi

  1. #1

    Gestire permessi

    Salve ragazzi. Leggendo sul forum mi sono imbattuto in un problema che già avevo affrontato ma che non sono riuscito a rislvere: la gestione dei permessi. Sono alla ricerca di un metodo sicuro ed affidabile per gestire permessi (su file, per gli utenti, ecc). Quello che mi serve è un meccanismo, una spiegazione, un metodo di applicazione. Non mi serve uno script o una classe ma proprio la spiegazione pratica del funzionamento di una cosa del genere. Vorrei capire come è possibile poter gestire una cosa del egenere e quali sono i metodi più affermati. Ho sentito parlare di Access Control List (ACL) ma non ho la minima idea di come si potrebbe implementare una cosa del egenere. Insomma, qualche approfondimento.

    PS
    La guida su freephp.it (gestire gli utenti con PHP) l'ho già letta. Ciao!
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  2. #2

    Sfruttare i vettori di sessione

    Ciao Mircov,
    se ho capito bene ti interessa capire il meccanismo per creare livelli differenti di permessi in un'area riservata del sito, è corretto?
    Potrei scrivere per settimane su questo argomento (= molto più di una pillola ) ma sono stracarico di lavoro e ti illustrerò il concetto di base di una possibile soluzione.

    Nella tabella degli utenti, oltre agli altri dati/parametri, inserisci un campo varchar (per esempio 'allow' varchar(7)) in cui memorizzerai l'array dei permessi in formato stringa.
    Prima di tutto devi progettare per bene il tipo di operazioni disponibili da disciplinare con i permessi, è importantissimo! Per esempio:

    • $allow[0] lettura files cartella utente
      $allow[1] scrittura files cartella utente
      $allow[2] lettura files admin
      $allow[3] scrittura files admin

    Ad ogni elemento associ il valore 0 o 1 a seconda che quel livello di permesso sia abilitato o no. La concatenazione degli elementi dà luogo alla stringa dei permessi; come elemento separatore per esempio puoi usare il punto (".").
    Se un navigatore che accede ha la stringa 1.1.0.0 è chiaramente un utente, se la stringa è 1.1.1.1 ovviamente si tratta di un amministratore con pieni poteri di letture/scrittura/modifica etc, se ha 1.1.1.0 è un assistente-amministratore e così via...
    Nella pagina del login estrai il campo allow dal DB e lo esplodi in un array:
    Codice PHP:
    // $allow è la stringa del campo permessi;
    $allow explode("."$allow);
    $_SESSION['allow'] = $allow
    In questo modo hai memorizzato il vettore dei permessi in una variabile di sessione fin dalla pagina di login: l'utente se la porterà appresso per tutta la sua permanenza nell'area riservata che stai costruendo.

    In questo modo l'esecuzione di qualsiasi tipo di codice può diventare condizionale.
    Per esempio puoi regolamentare l'accesso ad ogni singola pagina, o a dei contenuti parziali, oppure ancora l'esecuzione di funzioni o di singole istruzioni in base alla presenza del permesso relativo a quell'operazione specifica. Per questo ci vuole solo un po' di fantasia:
    Codice PHP:
    if ($_SESSION['allow'][3] == 1)
    {
    echo 
    "[B]Pagina di inserimento prodotti[/B]

    etc etc...
    \n"
    ;
    }
    else { echo 
    "Non si dispone dei permessi necessari per visualizzare questa pagina.\n"; } 
    Per uscire dall'area dovrai creare una pagina di logout in cui distruggi il vettore dei permessi di sessione, per esempio con l'unset():
    Codice PHP:
    unset($_SESSION['allow']); 
    Questo avverrebbe automaticamente se il browser venisse chiuso.
    Ma se vuoi che l'area riservata sia "isolata" dal resto del sito, dovrai inserire quell'unset() anche in tutte le pagine del sito che non fanno parte dell'area, cosicché se il navigatore esce senza passare per la pagina di logout (per esempio con un link verso la home page) la sessione venga annullata.

    In aggiunta ci sarebbero da dire molte altre cose interessanti... :master: mmh...
    Molte le scoprirai da te lavorando con questo sistema. Per esempio, se i permessi di accesso di un utente vengono modificati da un amministratore mentre l'utente è connesso è ovvio che per lui non verranno aggiornati automaticamente durante la sessione.
    Mai usato quei programmi (gestionali ma anche altri) che per rendere effettive le modifiche operate su un account richiedono di "uscire e rientrare"? Beh, il principio di funzionamento non è molto diverso. Il vettore di sessione viene ricomposto leggendo dal DB i dati dei permessi solo rieffettuando l'accesso. E il tuo utente vedrà nuove opzioni disponibili...

    Questo è il concetto di base, che è possibile anche sviluppare con le classi. In un ambiente di variabili molto vasto può senz'altro aumentare l'organicità del codice.

    Altra osservazione: la durata della sessione di collegamento all'area riservata sarà esattamente quella stabilita dalle impostazioni di php sulla macchina su cui gira il tuo sito. Se il php è installato su webserver Apache la durata della sessione dovrebbe essere impostata di default a 1800 sec (30 min), su IIS a 10800 sec (3 ore); la configurazione del parametro session.gc_maxlifetime è nel file php.ini.

    Come ho premesso, la progettazione dei livelli di permesso è importantissima, e per un lavoro efficiente dovrebbe prevedere anche eventuali espansioni postume dei permessi (qualcuno dice che in un lavoro perfetto il 90% di tempo è pianificazione, il 10% è realizzazione ). Infatti sebbene l'estensione della stringa dei permessi sia possibile in un secondo momento, è pur vero che conservare una certa organicità per la struttura dei suoi elementi mantiene il codice più semplice, leggibile e facile da rielaborare in seguito.

    Ti sono stato di aiuto?
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  3. #3
    Scusami se ti rispondo ora ma credevo non avesse risposto nessuno ed avevo recuperato la discussione per un bell'up. Invece noto che non solo mi avevi risposto ma soprattutto che il forum non mi ha mandato l'email di notifica! mha! Sono tempi duri!
    Tornando a noi, in primo luogo grazie per la risposta molto molto esauriente!

    Immagini che l'argomento sia molto molto vasto e che le possibili aplicazioni siano infinite. Queste tue spiegazioni, però, mi hanno aiutato molto a capire un po' meglio la situazione che cmq non è del tutto chiara. Magari, se tu non hai tempo, potresti indicarmi qualche risprsa interessante da poter consultare!

    Poi una domanda, il metodo che hai descritto non è molto diverso da quello descritto nell'articolo che ho linkato nel mio primo post. Ciò che cambia è solo il modo di implementarlo! Nell'articolo, infatti, si usano id esponenziali (si dice così? Bho! Non ricordo) mentre tu memorizzi l'array sotto forma di stringa da esplodere. Diciamo che alla fine il risultato ottenuto è lo stesso, quello che cambia è il metodo di memorizzazione.

    Quindi diciamo che dovrei assegnare un permesso ad ogni operazione possibile (tipo modifica, cancellazione, inserimento, visualizzazione, ecc) tutto questo per ogni modulo (news, immagini, bookmarks, ecc) che volgio implementare. Si, diciamo che nella mia testa sta cominciando a prendere piede un'idea di implementazione. Grazie mille per la risposta, però qualche altra risorsa sarebbe gradita comunque. Ancora grazie! Ciao!
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  4. #4
    Salve scusate se mi inserisco ma servirebbe anche a me una roba del genere cortesemente
    questa parte dove andrebbe inserita

    $allow[0] lettura files cartella utente
    $allow[1] scrittura files cartella utente
    $allow[2] lettura files admin
    $allow[3] scrittura files admin

  5. #5
    Utente di HTML.it L'avatar di torrone
    Registrato dal
    Apr 2006
    residenza
    Padova
    Messaggi
    1,128
    Ciao... Ma una stringa di questo 1.1.1.1 come la modifico? Ce riesco a modificare un singolo valore?

  6. #6
    Leggi questo:
    http://php.html.it/articoli/leggi/90...nti-con-php/1/

    e questo per capire come immagazzinare dei permessi in un numero intero con le operazioni bit a bit:
    http://php.html.it/articoli/leggi/92...e-il-database/

    In realtà quest'ultimo articolo è un po' approssimativo e dà informazioni errate.
    Dice in particolare che un campo tinyint permette di immagazzinare fino a 255 permessi:

    ...Dall'articolo di Ermanno Ancona:
    Come si può notare assegnando tali valori impostiamo ad 1 uno solo dei bit della sequenza, ovvero impostiamo il famoso flag. Per quanto riguarda la tabella di database, riferendoci a MySQL, potremo utilizzare un campo tinyint unsigned per memorizzare le preferenze degli utenti. Questo ci garantisce un range di valori da 0 a 255. Se prevedete un numero maggiore di opzioni utilizzate un campo intero più grande.
    Dal momento che gni permesso corrisponde ad una potenza di 2, il numero massimo memorizzato nel campo permessi dell’utente sarà 2 elevato al numero di permessi; pertanto con un campo tinyint si possono gestire al massimo 8 permessi (cioè 28).

    Siccome PHP sui S.O. più diffusi gestisce interi relativi (INT SIGNED) fino ad un massimo di 31 bit, che corrispondono al numero intero base dieci 2147483648, se si considerano solo gli interi positivi (INT UNSIGNED) si guadagna un bit in più, arrivando al numero massimo 2^32 = 4294967296.


    A conferma di questo, lo script PHP per la gestione degli utenti scritto da Gabriele Farina che ho linkato per primo usa esattamente quel sistema, e a conferma di quanto ho scritto non può gestire più di 32 permessi.

    Ciao
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.