Autore Topic: Permessi in un Gestionale  (Letto 959 volte)

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Permessi in un Gestionale
« il: 05 Dicembre 2010, 01:53:37 »
Quando tempo fa chiesi come poter gestire i permessi nel mio gestionale l'amico Dex mi dette questa risposta.

Citazione da: dex
per la tua richiesta sui profili, io nel mio progetto ho creato un form di accesso con inserimento del nome e password (ogni operatore ne ha uno) poi una volta entrato si apre il main e in un file (criptato) assegno i permessi di cio che possono o non possono fare con il programma, per alcuni utenti rendo alcune voci del menu invisibili, un solo utente (amministratore) ha accesso completo al programma.

Ora che ho qualche conoscenza in più di prima, mi piacerebbe capire come poter assegnare questi permessi.

Se ad esempio seguissi il consiglio di Dex come potrei ragionare il file criptato (come si cripta un file?) e quali informazioni ci metto dentro? Cioè come faccio a far capire a Gambas che quell'utente può cliccare su un pulsante, oppure come rendere invisibili altri, ecc...

E' una configurazione che devo fare nell' Form_open attraverso dei select case o if ... then? Cioè, ogni Form si apre in base ai permessi della persona che lo ha aperto.

L'idea è interessante, però stavo pensando che in questo modo, se volessi cambiare utente in corso, ad esempio da "Admin" ad "User" (dove "Admin" ha tutti i permessi, mentre "User" no) dovrei anche far chiudere tutte le Forms rimaste aperte che User non potrebbe aprire (considerando che il mio gestionale è incentrato su un WorkSpace principale...)  :-\


Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Permessi in un Gestionale
« Risposta #1 il: 05 Dicembre 2010, 10:51:03 »
io in gosh ho un form in cui vengono creati i vari utenti , ognuno dei quali ha una propria password e un proprio livello utente, la password viene criptata con md5 e salvata nel db , quando devi verificare se un utente immette una password corretta faccio un md5 della pass digitata e verifico che sia uguale a quella memorizzata.

quando viene effettuata un operazione inserisco un codice di controllo per verificare che il livello richiesto sia adatto con

Codice: gambas [Seleziona]

If Mlog.controllo(1) Then
 codice da eseguire
Endif

il numero passato come parametro indica il livello richiesto per l' operazione da eseguire

la funzione di controllo:

Codice: gambas [Seleziona]

Public Sub controllo(privilegio As Integer) As Boolean
 
  Dim risultato As Boolean
  Dim p As String
 
  If opzioni.cerca("gestutenti") = -1 Then
 
          If Avvio.privilegio <= privilegio Then
            risultato = True
          Else
            If privilegio = 0 Then p = ("capo")
            If privilegio = 1 Then p = ("schiavo")
            If privilegio = 2 Then p = ("sola lettura")
           
            Message.Error(("utente non abilitato all' operazione" & "\n" & ("Privilegio minimo richiesto") & ": " & p), "OK")
          Endif
  Else
      risultato = True
  Endif
       
       
   Return risultato
           Catch
               
             
               Message.Error(Error.Where & " \n" & Error.Text, " ok")
               'Application.MainWindow.Close
End


come vedi io utilizzo 3 tipologie di privilegi

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Permessi in un Gestionale
« Risposta #2 il: 05 Dicembre 2010, 10:59:14 »
Inoltre, potresti abilitare o meno determinate voci di menu semplicemente utilizzando l'attributo Visibile.
Ad esempio, se hai un menu a tendina ed hai dentro di esso una tendina denominata "Amministrazione" in cui raggruppi tutti i "poteri", cioè le routine usabili dall'amministratore, potresti semplicemente controllare i privilegi ed abilitare con Amministrazione.Visibile = TRUE quel menu solo agli amministratori.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Permessi in un Gestionale
« Risposta #3 il: 05 Dicembre 2010, 15:42:57 »
Grazie mille!

Io vorrei implementare entrambi i meccanismi che mi avete proposto...

@Fsurfing...

[Premessa]
Sai che il tuo Gosh me lo spulcio sempre con piacere... infatti avevo osservato con compiacimento il tuo meccanismo di filtraggio delle operazioni permesse.
PS. In seguito ruberò  :P anche la realizzazione di una tabella LOG... Poter registrare ogni operazione eseguita è fondamentale per monitorare il corretto andamento del flusso di lavoro.
[/Premessa]

Se ho ben capito...
Ogni volta che faccio eseguire un'operazione al Database (interrogazione, inserimento, modifica, cancellazione, ecc.) prima faccio partire la routine Function Boolean per il controllo dei permessi.
Quando la chiamo devo inserire nel suo parametro il valore di privilegio richiesto.

In linea di principio mi piace tantissimo, ma c'è una differenza su come vorrei strutturare la gestione dei permessi.
I miei utenti possono avere privilegi non basati su una struttura piramidale, ma alcuni possono fare alcune cose, mentre altri altre cose. In questo caso penso che potrei usare le lettere dell'alfabeto... e con instr() riconoscere se il permesso compare.

Mettiamo che l'utente "Tizio" può:
Leggere (L), Inserire (I), Modificare (M) e Cancellare (C) i DATI_ANAGRAFICI dei clienti (operazione "01"), Tizio potrebbe avere nel suo campo_permessi un codice "01LIMC" (dove 01 è il valore numerico che assegno a questa operazione)
Leggere (L) gli ORDINI (operazione "02"), Tizio potrebbe avere nel suo campo_permessi un codice "02L" (dove 02 è il valore numerico che assegno a questa operazione)
Quindi "Tizio" avrebbe nella stringa permessi "01LIMC|02L|ecc..."

Mettiamo che l'utente "Caio" può:
Non può fare alcuna operazione sui Dati (operazione "01")
Leggere (L), Inserire (I), Modificare (M) gli ORDINI (operazione "02") sui clienti, Caio potrebbe avere nel suo campo_permessi un codice "02LIM" (dove 02 è il valore numerico che assegno a questa operazione)
Quindi "Caio" avrebbe nella stringa permessi "02LIM|ecc..."

Così Tizio avrà "01LIMC|02L|ecc..."
mentre Caio avrà "02LIM|ecc..."

In questo modo, quando faccio partire un'operazione sul database la Function potrebbe essere del tipo:
Codice: gambas [Seleziona]
If Mlog.controllo('02M') Then
  codice da eseguire
Endif


Ed il controllo mi restituisce TRUE se, nella stringa (che ricavo con uno SPLIT, "|" ed un FIND."02" sull'array di split), trova instr[stringa_trovata] "M", mentre restituisce FALSE se non trova niente.
Quindi nell'esempio '02M': per Tizio il controllo restituisce FALSE, mentre per Caio TRUE...

Per far girare il tutto dovrò creare un apposito Form per la gestione dei permessi, con tutto l'elenco delle possibili operazioni!


@Leo:
per i pulsanti posso usare un procedimento simile... Anzi potrei settare direttamente la proprietà dei pulsanti .Enable o .Visible = controllo('01M')
Inoltre, come consigliatomi da milio per popolare il WorkSpace io uso una TreeView... Quindi in base all'utente mi basterebbe modificare la struttura dell'albero...


Per il cambio_utente con privilegi differenti durante il programma in esecuzione, sono orientato a far fare il controllo dei Children Aperti nel WorkSpace, e se un utente può visualizzare la classe genitrice di quell'istanza FORM rimane visibile, altrimenti si chiude. E chiaramente dovrà aggiornare la struttura della treeview e del Menù al nuovo utente...


Intanto vi comunico che il gestionale sta venendo proprio carino! Grazie Mille per i consigli, senza di voi sarei perso!! :2birre:
« Ultima modifica: 05 Dicembre 2010, 15:46:37 da perseo »

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: Permessi in un Gestionale
« Risposta #4 il: 05 Dicembre 2010, 18:52:28 »
Ciao perseo

nel mio gestionale uso un file (criptato) in cui per ogni utente creo una riga

utente-10101000010001000010001000100100000010000@1:password
per caricare i permessi uso tre variabili in un modulo
M1.Name
M1.Passw
M1.Permes[]

il - e i : mi servono per dividere la stringa com mid

il numero dopo la @ indica se l'utente è amministratore oppure no

in fase di apertura il progetto non parte dal main ma da un form PassWd.

In PassWd carico il file lo decripto e l'utente scelto deve inserire la password, se corrisponde si apre il main in caso contrario registra l'errore (utente ora data e password) su database segreto.

tutti i numeri 1 e 0 non sono altro che i permessi che l'utente ha nel gestionale, nel menu del main le voci menu sono tutte invisibili, se per esempio il form fatture che corrisponde al 4 numero è 0 la voce resta invisibile.

Chiaramente si può incrementare all'infinito, tipo:
0 = invisibile
1 = visibile ma non modificabile
2 = visibile e modificabile
ecc..

su uno di quei numeri indico anche se le operazioni (modifica eliminazione record) che effettua l'utente devono essere registrate (su database segreto) oppure no

al posto dei numeri puoi usare anche lettere A B C

Se qualcuno modifica o sostituisce quel file il progetto non si avvia e l'utente deve chiamare l'amministratore.

può sembrare paranoico, ma è proprio con queste paranoie che abbiamo scoperto un maneggione della cassa, poi soprattutto nella mia azienda dove si maneggiano molti soldi e su varie casse non c'è paranoia che basti.