Poco tempo fa abbiamo visto come creare una login sicura per accedere a un’area di amministrazione.
A questo punto potremmo fare un passo avanti e stabilire, per ogni utente, quali sono le aree in cui può accedere e quali invece nascondergli.
Un campo nel database per gestire i livelli
Possiamo gestire la cosa in due modi.
In un caso, nella tabella utenti
(che abbiamo già nel database) aggiungiamo un semplice campo chiamato livello
, che conterrà un valore intero. All’utente amministratore daremo il valore “1”, mentre a seguire gli altri utenti avranno un numero superiore, che corrisponde a un privilegio via via più basso.
Ogni livello avrà accesso a determinate aree. L’amministratore, naturalmente, avrà accesso a qualsiasi area, mentre gli utenti del secondo livello, per esempio, potranno accedere a tutto tranne all’area di gestione delle password o della creazione delle fatture. Gli utenti di terzo livello, invece, si vedranno negare anche aree minori come la possibilità di modificare alcuni dati.
Naturalmente, le pagine o le aree di accesso per ogni livello saranno a discrezione del programmatore e potranno essere diverse da sito a sito.
Usando questo metodo, è molto semplice negare l’accesso. Ci basta estrarre il livello dell’utente (per esempio in una variabile di sessione) e fare un controllo a inizio della pagina voluta. In caso di privilegi troppo bassi, si reindirizza all’index o a una qualsiasi altra pagina:
1 2 |
if($_SESSION['livello']>2) header("Location: index.php"); |
Il metodo è molto semplice, ma in alcuni casi limitante. Se per esempio in futuro avremo la necessità di creare un utente intermezzo al livello 2 e al livello 3 (in pratica, con privilegi superiori al 3 ma inferiori al 2), potremmo essere costretti a modificare del codice o i valori nel database.
Una stringa nel database in binario per gestire gli accessi
Vediamo un metodo più efficace, anche se leggermente più laborioso.
Invece di un valore intero, potremmo salvare all’interno del campo livello
una stringa contenente del codice in binario. Ogni posizione (ogni numero) identifica un’azione e il valore (0 o 1) stabilisce se si ha accesso a quell’azione o meno.
Facciamo un esempio. Stabiliamo che la prima posizione si riferisca all’area “gestione utenti”, la seconda a “gestione fatture” e la terza a “visualizzazione dati”. A ognuna di queste sezioni corrisponde un’area del sito, una parte di pagina o un’azione (a vostra discrezione). Per “gestione utenti”, per esempio, uno 0 impedirà di accedere alla pagina che gestisce gli utenti. Per “visualizzazione dati”, invece, uno 0 impedirà la vista di una parte di pagina in cui si mostra l’elenco dei dati.
Adesso prendiamo quattro utenti fittizi (già presenti nella tabella utenti
) e compiliamo il loro campo livello
rispettivamente con queste stringhe:
Campo per l’utente A: 111
Campo per l’utente B: 011
Campo per l’utente C: 001
Campo per l’utente D: 001
Traducendo in parole:
L’utente A visualizza tutte e tre le sezioni (ha tutte le posizioni a 1).
L’utente B può gestire le fatture e visualizzare i dati, ma non può gestire gli utenti (la prima posizione è a 0).
Gli utenti C e D possono soltanto visualizzare i dati.
In caso di aggiunta di un’altra sezione, dovremmo creare un ulteriore 0 o 1 in fondo alla stringa del campo livello
. Per esempio, potremmo aggiungere la quarta posizione “gestione pagine del sito”. Di conseguenza gli utenti saranno modificati in questo modo:
Utente A: 1111
Utente B: 0110
Utente C: 0010
Utente D: 0010
Potenzialmente non esiste limite alla quantità di aree gestibili in questo sistema e non vengono intaccati i precedenti permessi.
Come controllare l’accesso a un’area
Adesso ci sarà utile la funzione per controllare se l’utente ha effettivamente accesso all’area o all’azione richiesta.
1 2 3 4 5 6 7 8 9 |
//estrae il valore della posizione-livello passata: true se è 1 (attivo), false se è 0 function livelli_valore($posizione){ $char=$_SESSION["livello"][$posizione-1]; return $char; } //funzione da richiamare a inizio pagina o all'interno dell'area da controllare if(!livelli_valore(2)){ header("Location: index.php"); } |
In questo caso ho controllato la seconda posizione della stringa, cioè “gestione fatture”. Se risulta uno 0, l’utente non può accedere (utenti C e D) e viene reindirizzato all’index. Altrimenti lo script nel resto della pagina viene eseguito (utenti A e B).
Quello che abbiamo visto è la base per la gestione di un sistema a livelli. E’ possibile, naturalmente, (e auspicabile) creare una pagina ad hoc per cambiare i permessi degli utenti o per aggiungere una sezione senza dover intervenire direttamente nel database.
Esempio
Riassumiamo i concetti, facendo un esempio concreto (e minimale: dovranno essere apportate le dovute integrazioni, dove c’è bisogno).
Inseriamo nel database una tabella user_livelli
, che conterrà il nome delle pagine e la loro posizione nella stringa dei livelli utente:
1 2 3 4 5 6 7 8 9 10 11 12 |
CREATE TABLE IF NOT EXISTS `user_livelli` ( `id` int(11) NOT NULL auto_increment, `posizione` int(3) NOT NULL, `nome` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; INSERT INTO `user_livelli` (`id`, `posizione`, `nome`) VALUES (1, 1, 'Amministratore (solo supervisore)'), (2, 2, 'Fatture di acquisto'), (3, 3, 'Fatture di vendita'), (4, 4, 'Riepilogo fatture'); |
La nostra tabella utenti sarà di questo tipo (al posto dei […] ci potranno esserci altri campi a piacere, come il nickname):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL auto_increment, `username` varchar(255) NOT NULL default '', `password` varchar(32) NOT NULL default '', [...] `livello` varchar(200) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; INSERT INTO `user` (`id`, `username`, `password`, [...] `livello`) VALUES (1, 'Admin', 'password_criptata', [...] '1000'), (2, 'Utente1', 'password_criptata', [...] '0110'), (3, 'Utente2', 'password_criptata', [...] '0001'); |
Il campo livello
del database contiene una stringa, che si collega immediatamente con il campo posizione
della tabella user_livelli
. Come notate, infatti, la stringa ha quattro cifre (in binario) e la tabella user_livelli
contiene esattamente quattro tipologie di livello.
L’Admin, nel nostro caso, una volta che accederà avrà soltanto il potere di supervisore (solo la posizione 1 è attiva, le altre gli sono negate). L’Utente1, invece, potrà gestire le fatture di acquisto e di vendita, ma non potrà vedere il riepilogo delle fatture (posizione 2 e 3 attive, posizione 4 disattivata).
Una volta impostate le basi nel database, vediamo come è possibile integrarle nel sito. Poniamo il caso di avere due pagine, chiamate fatture_vendita.php
e utenti.php
. La prima permette di gestire le fatture di vendita, la seconda mostra l’elenco degli utenti registrati.
Noi vogliamo fare in modo che gli utenti siano visibili soltanto all’amministratore. All’inizio della pagina utenti.php
inseriamo quindi il controllo che abbiamo viso sopra:
1 2 |
if(!livelli_valore(1)){ header("Location: index.php"); } |
In pratica, controlliamo che l’utente abbia attiva la posizione 1 nel database: in tal caso si può proseguire e vedere l’elenco degli utenti; in caso contrario, si viene reindirizzati alla homepage.
Nel nostro esempio, solo l’utente Admin ha la prima posizione attiva (la prima cifra della stringa a 1), quindi lui soltanto potrà accedere alla pagina.
Lo stesso concetto si farà per la pagina fatture_vendita.php
, ma in questo caso il controllo dovrà essere fatto sulla terza posizione:
1 2 |
if(!livelli_valore(3)){ header("Location: index.php"); } |
L’Utente2 potrà accedere alla pagina, mentre tutti gli altri utenti si vedranno reindirizzare a index.php
.
Ciao ho trovato molto interessante il tuo articolo avreisti qualche esempio completo da mostrare per approfondire il discorso?
Ciao Giuseppe,
grazie per i complimenti =)
Ho aggiornato l’articolo con un esempio, che comprende le tabelle del database. Si tratta della base, ma se hai un po’ di confidenza con il php e il mysql non dovresti incontrare problemi.
Ciao ma per i contenuti vale la setssa cosa?nel senso che se un utente aggiunge una notizia gli do un valore 0 nel database, mando all’ amministratore e lui da valore 1 alla notizia se è pubblicabile?
cmq l’ articolo è chiaro!grazie
Ciao Davide,
questo articolo si riferisce più che altro ai permessi degli utenti: serve per stabilire, cioè, se l’utente può “vedere” o meno un’area del sito.
Potrebbe essere applicato anche per i contenuti, ma nel tuo caso ti consiglio di usare una tabella a parte, perché le notizie possono essere anche centinaia e non vale la pena creare una stringa di permessi così lunga.
In pratica:
– crei la tabella dove viene salvata la notizia. In questa tabella deve esserci un campo “id_utente” dove salvi l’id dell’utente che l’ha scritta e un campo “approvato” che durante l’inserimento è a 0.
– se l’amministratore approva la notizia, il campo “approvato” va a 1 e significa che la notizia è pubblicabile.
allora ragazzi io vado in qst sito e cerco di iscrivermi una volta iscritto dovrebbe arrvarmi l’e-mail ma nn mi arriva la conferma e mi dice ke forse:nn ho diritti pivilegi……..
cosa dovrei fare???
scusate il sito è *** !
Dovresti chiedere direttamente agli amministratori del sito, Andrea.
Probabilmente gli amministratori devono valutare la tua iscrizione e, in caso di esito positivo, ti invieranno l’email con la password (a volte serve tempo). Non hai i privilegi semplicemente perché non hai user e password da inserire per accedere.
Comunque la tua domanda non rientra nell’argomento di questo articolo… una risposta non la troverai leggendo sopra. Se mastichi poco l’inglese (il sito non ha una lingua italiana, da quello che vedo) ti conviene fare una ricerca su Google per trovare forum in cui ne parlano.
Ciao Manuel,
ho letto qualcuno dei tuoi articoli e l’ho trovati interessanti.
Sto cercando di trovare uno script, una funzione o un articolo che tratti di come sia possibile (se lo è!!) controllare che lo stesso utente non esegua due volte il login, ovviamente sulla stessa applicazione. Se avessi qualche info da girare, te ne sarei grato.
Grazie, Domenico
Ciao Domenico,
se ho capito bene quello che stai cercando è una semplice login. Guarda per esempio questo articolo:
http://www.manuelmarangoni.it/sir-bit/343/php-creare-una-login-sicura-e-funzionale-usando-i-cookies/
In pratica, una volta che l’utente ha fatto la sua login, viene creato un cookie contenente i suoi username e password. Ti basta controllare (su ogni pagina) che questo cookie esista e contenga username/password esatti: in questo caso l’utente non ha bisogno di fare nuovamente il login.
articolo molto interessante, avresti degli esempi , vorrei applicarlo a ciò che sto lavorando un applicazione per la gestione dei corsi aziendali:
grazie comunque.
saluti
A fine articolo è già presente un esempio di base. Hai qualche dubbio in particolare?
perdonami Manuel, ma non riesco proprio a comprendere il funzionamento della funzione.
Premetto che sono alle prime armi con php e mysql ma
come può una semplice riga del genere, estrapolare la stringa dal database, trasformarla in un array e utilizzarla per dare un valore alla sessione? qualcosa mi sfugge?
Non capisco come una semplice stringa possa essere usata in quel modo.
Ciao Giacomo,
$_SESSION[“livello”] contiene la stringa del campo “livello” presa nel database. Questa la devi aver già estrapolata dal database (in pratica si crea quando l’utente si logga: in $_SESSION[“livello”] è contenuto il valore del suo campo “livello” )
Il lavoro lo fa tutto la funzione “livelli_valore”.
Come parametro gli passi la posizione da controllare (in pratica un valore numerico): lui controlla semplicemente se $_SESSION[“livello”] , nella posizione specificata dal parametro, è =1 oppure =0
Esempio:
Il terzo posto è associato alla pagina “auto”.
L’utente si logga. Di conseguenza viene creato il suo $_SESSION[“livello”].
Per controllare se l’utente può accedere alla pagina “auto”, devi controllare il terzo carattere del suo $_SESSION[“livello”], ovvero usi la funzione:
livelli_valore(3)
Se ritorna 1, significa che l’utente può avere accesso alla pagina “auto”.
Ciao Manuel,
mi associo al pensiero di Giacomo, credo di aver capito il concetto di come gestire i permessi con la stringa “binaria” del campo livelli e il valore del campo posizione, ma non comprendo quando e come questi due campi lavorano insieme.
In altre parole con capisco quando tu scrivi:<>. Potresti gentilmente spiegarmi come mettere in relazione questi due campi.
[Edit]
Questo è quello che tu hai scritto:
“Il campo livello del database contiene una stringa, che si collega immediatamente con il campo posizione della tabella user_livelli.”
Scusa nel post precedente non mi ha riportato il contenuto presente tra i segni di max-min.
Grazie.
Gigi Coco
Ciao Gigi,
ti ho unito i due commenti, così rispondo in uno solo 🙂
Vediamo se riesco a spiegarmi meglio.
Poniamo il caso che ci siano due utenti che stiano navigando:
Marco => nel suo campo “livello” ha la stringa binaria ‘0110’
Giulia => nel suo campo “livello” ha la stringa binaria ‘0001’
Questi utenti stanno navigando nella pagina delle fatture di acquisto. Come faccio a sapere se hanno i permessi per vederla? Nel database “Fatture d’acquisto” ha il campo “Posizione” a 2.
Per sapere se gli utenti possono vederla, devo guardare la seconda cifra (posizione 2) della loro stringa binaria. Per Marco la seconda cifra è 1, mentre per Giulia è 0: quindi solo Marco può vedere la pagina.
Stabilito questo, devo dire alla pagina: “Soltanto quelli che hanno la seconda cifra del binario = 1 devono poter vedere la pagina, gli altri devono essere reindirizzati”.
Questo posso farlo con la funzione “livelli_valore”, da mettere come primo codice nella pagina: è sufficiente far passare come parametro la posizione da controllare (nel nostro caso 2). La funzione controllerà da sola che la stringa binaria dell’utente che sta navigando sia a 1 nella seconda cifra, perché questa stringa è contenuta in $_SESSION[“livello”].
Se vuoi puoi migliorarla, evitando l’uso della sessione e facendo passare direttamente la stringa binaria dell’utente come secondo parametro di “livelli_valore”. Dipende tutto da come vuoi gestirla, qua sopra c’è solo uno dei tanti esempi possibili
Grazie mille per la risposta e per la tua disponibilità.
Il concetto è molto chiaro infatti non ho dubbi che possa funzionare, il problema è metterlo in pratica. Forse mi sfugge qualcosa, ti farò sapere.
Grazie saluti.
Gigi.
Ciao Manuel,
ti volevo ringraziare perchè funziona alla grande.
Ottimo.
Grazie.
Gigi
Figurati 🙂
Ciao Manuel incontro un problema nel inserire la seguente stringa:
if(!livelli_valore(1)){
header(“Location: index.php”);
Da quello che ho capito la devo inserire nella pagina di cui voglio dare dei livelli di accesso, bene mi trovo a inizio pagina che inizia con un’altro codice php, ossia quella di login che effettivamente mi controlla se l’utente ha effettuato correttamente il login e inizia in questo modo dopo questa stringa inizia tutto il codice in HTML.
ora mi chiedo dove metto la tua stringa?? dove non sarebbe un problema ovviamente tra l’apertura e la chiusura del codice php ma da sempre errore…
ho notato che nella tua stringa non chiudi la parentesi graffa
<?php
session_start();
if(empty($_SESSION['nid'])) exit (header("Location: ../index.php"));
if(!livelli_valore(1)) { <—- questa parentesi???
header("Location: ../index.php"); } <—- chiusa graffa
ho provato a chiuderla come vedi ma da sempre errore..
come posso risolvere questo dilemma ?
Grazie per la tua pazienza…
Ciao Giuseppe,
hai ragione, avevo tagliato la riga con la chiusura della graffa (grazie della segnalazione, ho sistemato).
In ogni caso aggiungendo la graffa non dovrebbe darti errore. Che tipo di errore ti butta fuori?
Sinceramente non so dove inserire la funzione function.
function livelli_valore($posizione){
$char=$_SESSION[“livello”][$posizione-1];
return $char;
}
gentilmente potresti farmi vedere i tuoi file .php cosi capisco meglio dove inserire sia la funzione function che l’if.
Vorrei precisare che nella pagina che voglio collocare un livello inizia con
questo codice mi controlla che l’utente ha fatto il login o meno… dopo inizia il codice HTML ecc.
Grazie…
Il codice della sua funzione e il suo richiamo puoi inserirli subito a inizio pagina, anche prima di stampare una qualsiasi grafica html.
In pratica puoi prendere il codice di esempio che vedi nella sezione “Come controllare l’accesso a un’area” e copiarlo così com’è a inizio pagina, tra i tag php (sostituendo il 2 con il valore che ti serve, naturalmente).
scusami Manuel mi sto scoraggiando sempre più… ho inserito cosi la stringa a inizio pagina dove voglio che abbia l’accesso a livello.
ecc….
nulla mi fa sempre ritornare alla pagina index.php che ha o non ha i permessi.
Inviami il file php attraverso il form contatti, appena ho un attimo do un’occhiata veloce al codice (qua nei commenti alcuni codici vengono eliminati per questioni di sicurezza)
Che serva di lezione… ovviamente per far si che il codice di Manuel funzioni assicuratevi che nel file .php del login ci sia il richiamo della sessione interessata.
Nel mio caso mancava la seguente stringa….
$_SESSION[‘livello’] = $f1->livello;
Manuel grazie per la tua pazienza e professionalità….
Grazie a te per il feedback, magari può essere utile a qualcun altro in futuro 😉
Manuel avrei ancora bisogno del tuo aiuto, sto creando una form dove l’amministratore gestisce la creazione utenti e quindi solo lui potrà dare i privilegi e decidere chi e dove può accedere all’applicazione.
Mi trovo in grosse difficoltà a far inserire diversi campi in una unica colonna, mi spiego meglio, seguendo le tue indicazioni su come dare i livelli ai vari utenti funziona alla grande ma devo intervenire direttamente nel database e assegnare al singolo utente i suoi permessi nella colonna livello “01010”.
Il form che sto creando lo vorrei far diventare più pratico possibile, impensabile dare all’amministratore l’accesso al database e farlo interagire direttamente nella tabella utenti. Ho creato il form con questa struttura:
Inserimento Cliente SI – No
Modifica Cliente SI – NO
Inserimento Fattura SI – NO
Modifica Fattura SI – NO
ecc…
ovviamente il SI vale 1 il NO vale 0.
Tutti questi campi sono singoli tra di loro ma dovranno unirsi nella colonna livello ovviamente con il metodo PST, a questo punto l’amministratore quando crea o modifica i permessi dei vari utenti dovrà semplicemente cliccare sul si oppure no.
Mi sapresti spiegare con un esempio pratico così finisco di impazzire su come poter inserire nel form i vari livelli distinti tra loro e poi grazie al metodo POST riunirli nella colonna livello per ottenere il seguente valore, esempio: 01010.
Grazie…
Il risultato finale, quello che devi inserire nel database, è semplicemente una stringa di 0 e 1.
Il form che hai fatto va benissimo per facilitare il lavoro all’amministratore. Ogni campo del form avrà un suo nome: poniamo per esempio che si chiamino campo1, campo2, campo3, ecc.
Quando invii il form, ti basta concatenare i valori di ogni campo:
$stringa = $_POST[‘campo1’].$_POST[‘campo2’].$_POST[‘campo3’];
e salvi $stringa nel database, nel campo “livello” dell’utente.
Ciao, il tuo articolo è l’unica cosa che ho trovato nel mondo su questo argomento. Mi riferisco in particolare ai permessi con 0 e 1. Per favore potresti approfondire? Cioè come si passa alla pratica? Mi faresti una gentilezza anche solo indicandomi dove posso apprendere di più e il seguito.
Nel mio caso voglio associare i permessi direttamente all’user senza nome del permesso.
Poi, in base ai permessi abilitati con 1, l’user verrà prima indirizzato alla pagina specifica o alla pagina del suo profilo se ne è previsto uno per lui e da lì, in base ai permessi potrà eseguire determinate operazioni, come creare un evento.
Ciao Giorgio,
se ho capito bene quello che ti serve, il procedimento è lo stesso dell’articolo ma un po’ modificato. Ti scrivo i passi del ragionamento:
– nel record dell’user crei il campo “livello” dove metti la stringa fatta di 0 e 1. Ogni cifra rappresenta una pagina: per esempio la prima cifra rappresenta la pagina “calendario”. Se la prima cifra è 1, significa che l’utente può accedere alla pagina “calendario”.
– crei una funzione per controllare se l’utente può accedere alla pagina “calendario”. In pratica, alla funzione passi due argomenti: la stringa completa dei permessi e la posizione da controllare (nel nostro caso questo secondo argomento è =0 perché vogliamo controllare la prima cifra).
– all’interno della funzione controlli se la posizione da controllare vale 1 e in tal caso ritorni true.
– se la funzione a ritornato true, allora fai il redirect dell’utente verso la pagina “calendario”.
Grazie per la risposta. Mi era tutto gia chiaro grazie al tuo articolo. Cioè che mi servirebbe per favore è lo script che va a controllare se il valore è 0 o 1 in una determinata posizione.
In verità tu hai pubblicato uno script ma non riesco a farlo funzionare. Per favore potresti postare uno script completa? Oppure una guida completa. Grazie per il tuo aiuto.
Il contenuto dell’articolo è più un un’idea, un procedimento da seguire, per cui non servirebbe creare uno script da scaricare perché dipende molto da come hai costruito il sito. Sarebbe solo una copiatura dell’esempio che trovi a fondo articolo.
In ogni caso, se ho capito bene, il tuo problema è come far andare la funzione “livelli_valore()” una volta che hai estratto dei permessi da controllare, giusto? Ti faccio un altro esempio, vediamo se riesci a trovare la parte che ti manca.
Poniamo ad esempio che hai assegnato la tua stringa di permessi a questa variabile:
$permessi = “01001”;
Il mio esempio sopra tiene conto che tu la salvi in una variabile di sessione:
$_SESSION[“livello”] = $permessi;
in questo modo la funzione “livelli_valore” la leggerà in automatico.
Per controllare la posizione del secondo permesso ti basta controllare in questo modo:
if (livelli_valore(2)) { …[mostra la pagina]… }
In questo caso l’if darebbe true, perché la seconda cifra è un 1: quindi ti mostrerebbe il contenuto della pagina.
———————————————————-
NOTA: se non vuoi usare variabili di sessione, ti basta modificare la funzione “livelli_valore” aggiungendogli un parametro, in questo modo:
function livelli_valore($posizione, $stringa) {
$char = $stringa[$posizione-1];
return $char;
}
Per il controllo dovrai passare ovviamente entrambi i parametri, cioè:
if (livelli_valore(2, $permessi)) { …[mostra la pagina]… }
C’è un “2” anche nell’articolo e non capisco cosa sia.
Cmq l’idea che mi sono fatto per la mia esigenza è questa:
nel database ho “permessi” e contiene 110
valore numero 1 è 1 puoi leggere
valore numero 2 è 1 puoi scrivere
valore numero 3 è 0 non puoi cancellare
per ogni blocco del sito (o in futuro in modo meno barbaro con script più complessi) farò verificare i permessi
$permesso_leggere, cioè la prima cifra del numero 110…. è 0 o 1?
$permesso_scrivere, cioè la seconda cifra del numero 110…. è 0 o 1?
$permesso_cancellare, cioè la terza cifra del numero 110…. è 0 o 1?
devo avere uno script che dice
1.Crea una variabile permessi il cui contenuto è il valore del campo dal database “dbciao”, tabella “user”, colonna “permessi”;
2. Se IL VALORE DELLA SECONDA CIFRA è 1 ALLORA SCRIVI
che corrisponde a
$permessi=$row[‘permessi’];
$permesso_scrivere=SECONDO VALORE DI $permessi
if “$permesso_scrivere = 1 allora stampa il codice html per il form
altrimenti non stampare il form ma “chiedi di essere abilitato”
Ho tutto… mi manca solo trovare il valore di una determinata cifra in un numero binario e ciò questa parte della mia idea
$permesso_scrivere=SECONDO VALORE DI $permessi
Grazie ancora per il tuo tempo.
http://php.net/manual/en/function.substr.php
Risolto. Grazie al tuo articolo mi sono potuto fare un’idea quando non avevo idea di cosa fare. Ora ho anche trovato come fare.
Prego. L’importante è aver risolto 🙂
Ciao,
la mia tabella ‘user’ si chiama login, ho inserito il campo ‘livello’ con i vari permessi.
Ho creato la tabella ‘user_livelli’ esattamente come hai descritto tu.
Ho copiato:
//estrae il valore della posizione-livello passata: true se è 1 (attivo), false se è 0
function user_livelli_valore($posizione){
$char=$_SESSION[“livello”][$posizione-1];
return $char;
}
//funzione da richiamare a inizio pagina o all’interno dell’area da controllare
if(!user_livelli_valore(2)){
header(“Location: index.php”);
}
aggiunto user_ davanti a livelli_valore visto che la tabella è user_livelli, è corretto?
In testa alla pagina bcr.php a cui vorrei permettere/negare l’accesso.
Faccio il login, clicco sulla pagina bcr.php e ricevo i seguenti msg d’errore:
Notice: Undefined index: livello in C:\xampp\htdocs\login\bcr.php on line 9
Warning: Cannot modify header information – headers already sent by (output started at C:\xampp\htdocs\login\menu.html:7) in C:\xampp\htdocs\login\bcr.php on line 15
Dove sbaglio?
Mi manca qualcosa?
Nei commenti vedo qst stringa $_SESSION[“livello”] = $permessi; dove va?
Ciao Massimo,
$_SESSION[‘livello’] contiene la stringa dei permessi di un utente, che hai salvato nel database. Nell’esempio dell’articolo, se stiamo estrando i dati dell’utente A, avremo:
$permessi = ‘111’;
$_SESSION[‘livello’] = $permessi;
Assegni questo valore non appena estrai i dati dell’utente dal database. L’errore dovrebbe essere dovuto alla mancanza di questa assegnazione: prova ad aggiungerla, il notice dovrebbe scomparire.
Ciao Manuel,
ho provato a seguire i tuoi consigli. Ho inserito $permessi = $row[‘livello’]; nella pagina session.php. Ho risolto con l’errore, non compare più, ma non ostante i permessi vengano caricati correttamente, li ho scritti affianco al nome utente nel msg di benvenuto, nessun utente riesce ad accedere alla pagina bcr.php. Se hai tempo di buttarci un occhio, te ne sarei infinitamente grato. Come posso inviarti il pregetto in .rar?
Grazie
Per vari motivi, da qualche anno non faccio più consulenza via email, ma se posti qua gli errori tra i commenti vedo di darti una mano.
Se non ti appaiono altri messaggi di warning, il problema è probabilmente di concetto.
Prova a fare così: nel campo “livello” dell’utente metti tutti 1 (e stampa a video $_SESSION[‘livello’] per assicurarti che sia assegnato giusto): significa che tutte le pagine sono accessibili all’utente. Se l’utente non può ancora accedere, allora hai fatto qualche errore nella funzione “livelli valore”.
Non ho ne warning ne errori. I livelli sono tutti a 1 e li stampa correttamente.
Queste righe vanno in testa alla pagina dove voglio limitare l’acesso?
function user_livelli_valore($posizione){
$char=$_SESSION[“livello”][$posizione-1];
return $char;
}
if(!user_livelli_valore(2)){
header(“Location: index.php”);
}
la stringa $_SESSION[“livello”] = $permessi; dove va?
Se la metto in session.php da Notice: Undefined variable: permessi in C:\xampp\htdocs\login\session.php on line 13
Grazie
Scusa, i permessi me li stampa correttamente se metto in session.php
$query = “SELECT nome, cognome, sesso, livello from login where username = ‘$user_check'”;
…
$permessi = $row[‘livello’];
e stampo
Nella pagina dovresti avere un codice del genere:
….
$permessi = $row[‘livello’]; //poniamo che sia ‘1011’
$_SESSION[‘livello’] = $permessi;
function user_livelli_valore($posizione){
$char=$_SESSION[“livello”][$posizione-1];
return $char;
}
….
Per controllare se funziona bene, prova a fare dei test. Per esempio, per controllare la seconda posizione stampa:
$test = user_livelli_valore(2);
var_dump($test);
dovrebbe stamparti “0” a video (perché la seconda posizione è “0”).
Invece con:
$test = user_livelli_valore(1);
var_dump($test);
dovrebbe stamparti “1”.
Se è così, la funzione è costruita correttamente.
Ciao,
qst righe le devo mettere in session.php
$permessi = $row[‘livello’];
$_SESSION[‘livello’] = $permessi;
dove carico i dati di login.
Facendo le verifiche che mi hai chiesto è tutto corretto se metto:
function livelli_valore($posizione){
$char=$_SESSION[‘livello’][$posizione-1];
return $char;
}
e commento la parte if blah blah blah
ottengo:
string(1) “0”
string(1) “1”
se riattivo la parte if per vedere se mi fa entrare o no nella pagina mi manda sempre sulla index.php
È strano, se ti stampa correttamente “0” e “1” quando serve, la condizione deve vederla giusta. Nell’esempio che abbiamo appena fatto (cioè con $permessi=’1011′), se subito dopo scrivi:
if(!user_livelli_valore(1)){
header(“Location: index.php”);
}
non dovrebbe farti il reindirizzamento, perché non entra nell’if.
Invece con:
if(!user_livelli_valore(2)){
header(“Location: index.php”);
}
dovrebbe reindirizzarti all’index.
Se non è così, ci deve essere un qualche altro errore nel codice.
Niente da fare mi reindirizza in ogni caso, ho provato anche a mettere 3 e 4.
Provato a togliere il punto esclamativo nella “if” e da:
Notice: Undefined variable: _SESSION in C:\xampp\htdocs\login\bcr.php on line 6 cioè:
$char=$_SESSION[‘livello’][$posizione-1];
Ho capito l’errore, ma mi servirebbe un po’ di spazio per spiegartelo 🙂 Facciamo così: ti riscrivo il procedimento in un altro modo, in “chiaro”. Funziona allo stesso modo, ma evita l’uso di sessioni e di funzioni. In teoria ti basta copiare questo nella pagina, al posto di tutto quello che abbiamo visto sopra. Tieni conto che:
– ho scritto il codice al volo e non l’ho testato, ma il procedimento dovrebbe essere chiaro messo così;
– questo codice puoi copiarlo in tutte le pagine, cambiando solo il valore di $posizione.
//… parte iniziale: estrai i permessi dell’utente dal db
$permessi = $row[‘livello’]; //es: ‘1011’
$posizione = 1; //la posizione nei permessi da controllare
//pagina non accessibile: reindirizzamento
if ($permessi[$posizione-1] == 0) {
header(“Location: index.php”);
}
//… esegui il codice della pagina
Ciao,
ho ripulito e risistemato il codice.
Ora con “1” entra normalmente nella pagina ad accesso controllato mentre con “0” entra e mi da:
Warning: Cannot modify header information – headers already sent by (output started at C:\xampp\htdocs\login\menu.html:16) in C:\xampp\htdocs\login\bcr.php on line 6
i files che uso sono:
CONTROLLER.PHP
//Login Query
if(isset($_POST[‘login’])){
$sql = “SELECT username, password, nome, cognome, sesso, livello FROM login WHERE username=’$username'”;
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
if($row[‘password’] == $txtpassword){
$_SESSION[‘user_name’] = $row[‘username’];
$_SESSION[‘nome’] = $row[‘nome’];
$_SESSION[‘cognome’] = $row[‘cognome’];
$_SESSION[‘sesso’] = $row[‘sesso’];
$_SESSION[‘livello’] = $row[‘livello’];
//header(“location:login.php”);
} else {
$passwordErr = ‘
Login! Fallito.
‘;
$username = $row[‘username’];
}
}
} else {
$usernameErr = ‘
Username Non trovato.
‘;
$username = “”;
}
}
MENU.PHP
include ‘include/controller.php’;
$session_username = $_SESSION[‘user_name’];
$session_nome = $_SESSION[‘nome’];
$session_cognome = $_SESSION[‘cognome’];
$session_livello = $_SESSION[‘livello’];
if(empty($_SESSION[‘user_name’])){
header(“location:login.php”);
}
function user_livelli_valore($posizione){
$char=$_SESSION[‘livello’][$posizione-1];
return $char;
}
BCR.PHP
include ‘menu.html’;
//funzione da richiamare a inizio pagina o all’interno dell’area da controllare
if(!user_livelli_valore(2)){
header(“Location: login.php”);
}
da qualche parte c’è un inghippo che non capisco
aggiungo
LOGIN.PHP
include ‘include/controller.php’;
if(isset($_SESSION[‘user_name’])){
header(“location:profile.php”);
}
La funzione header() di PHP va usata prima di creare un qualsiasi output. Il messaggio di warning “Cannot modify header ecc.” significa che hai stampato qualcosa a video prima di header(): può essere un tag html, uno spazio, un file php incluso che stampi qualcosa o altro. Controlla di non stampare niente prima della condizione dove fai il reindirizzamento con l’header().
Se hai dei dubbi, ti conviene leggerti la pagina della documentazione ufficiale, ti fanno anche degli esempi:
https://www.php.net/manual/en/function.header.php
Intanto grazie ma non va.
Secondo me l’inghippo sta nel codice del login che uso. L’ho preso da qui:
https://www.codeandcourse.com/login-system-using-php-with-mysql-database-with-session/
Se puoi darci un’occhiata, quando hai tempo, magari capisci dove sbaglio. Io sono un newby per cui arrivo fino ad un certo punto.
Grazie mille