Cum se... creeaza un form de LogOn cu "drepturi de acces"

trucuri, sfaturi si alte idei pentru imbunatatirea lucrului cu Access
Închis
Dr.Windows
Moderator
Moderator
Mesaje: 4570
Membru din: Vin Iul 31, 2009 7:32 am

Cum se... creeaza un form de LogOn cu "drepturi de acces"

Mesaj de Dr.Windows » Joi Iul 07, 2011 11:44 am

In subiectul urmator incerc sa prezint una din multiplele variante de accesare a unei aplicatii in Access bazata pe un formular de LOGIN si drepturi de acces pentru celelalte formulare pentru Modificare (RW=Read-Write) sau doar Citire (RO=Read-Only).

Exemplul se aplica pentru Access 2007 & 2010 si este o idee inspirata din exemplul Northwind si alte variante.

Scopul demonstratiei: In functie de userul care se conecteaza la aplicatie, acesta va avea drepturi de "modificare" (inclusiv adaugare de inregistrari noi sau stergerea celor vechi) sau drept de "citire" (adica poate doar sa VADA inregistrarile existente, fara sa le poata modifica)

Asa ca sa incepem:

PRE1. Pentru gestionarea utilizatorilor avem tabela tblUsers care contine urmatoarele informatii:
  • UserName = Numele utilizatorului
    UserPassword = Parola utilizatorului (in acest exemplu este "in clar", si nefiind securizata in nici un fel nu recomand aplicarea ei in "productie")
    UserRights = Drepturile utilizatorului la nivelul formelor pe care le va deschide RW/RO
Pentru testare exista 2 useri:
  • admin cu parola admin cu drepturi RW si
    user cu parola user cu drepturi RO
PRE2. Pentru a testa functionalitatea mai sunt 2 tabele cu formele asociate: tblProduse si tblCategorii , respectiv frmProduse si frmCategorii - continutul acestora nefiind important.


Principiul de functionare:

1. Formularul de LogIn (frmLogIn) - este unul foarte simplu - cere un nume de utilizator si o parola apoi se apasa butonul Login - aici este "greul":

Cod: Selectaţi tot

Private Sub cmdLogin_Click()
    'Verifica sa existe completat un nume de utilizator
    If IsNull(txtUserName.Value) Or txtUserName.Value = "" Then
        MsgBox "Trebuie introdus un nume de utilizator!", vbCritical
        txtUserName.SetFocus
        Exit Sub
    End If
    
    'Verifica sa existe completata o parola
    If IsNull(txtPassword.Value) Or txtPassword.Value = "" Then
        MsgBox "Trebuie introdusa o parola!", vbCritical
        txtPassword.SetFocus
        Exit Sub
    End If
    
    'Verifica in tblUsers daca parola este cea pe care o "stie" utilizatorul
    If txtPassword.Value = DLookup("UserPassword", "tblUsers", "[UserName]='" & txtUserName.Value & "'") Then

        'Creaza 2 variabile globale unde stocheaza numele utilizatorului si drepturile sale
        TempVars.Add "pUserName", txtUserName.Value
        TempVars.Add "pUserRights", DLookup("UserRights", "tblUsers", "[UserName]='" & txtUserName.Value & "'")
        
        'Daca parola este corecta inchide formularul de LogIn si deschide "maniul principal"
        DoCmd.Close acForm, "frmLogIn", acSaveNo
        DoCmd.OpenForm "Switchboard"
    Else
        MsgBox "Parola incorecta. Reincercati", vbOKOnly, "Login Error"
    End If
    
End Sub
Dupa cum se vede, daca parola este corecta va deschide managetul de formulare al aplicatiei - Switchboard.

Daca vreti se poate "precompleta" numele userului cu cel al utilizatorului curent conectat pe statia Windows:

Cod: Selectaţi tot

Private Sub Form_Load()
    'Pre-completeaza numele userului cu cel care este logat pe statia Windows
    txtUserName.Value = Environ("Username")
    txtPassword.SetFocus
End Sub
2. Pentru a asigura deschiderea formularelor in functie de drepturile utilizatorului trebuie pus urmatorul cod in fiecare formular in evenimentul Form_Load:

Cod: Selectaţi tot

Private Sub Form_Load()
    'Asigura deschiderea formularului in functie de permisiunile utilizatorului
    If [TempVars]![pUserRights] = "RW" Then
        Me.AllowAdditions = True
        Me.AllowDeletions = True
        Me.AllowEdits = True
    Else
        Me.AllowAdditions = False
        Me.AllowDeletions = False
        Me.AllowEdits = False
    End If
End Sub
In cazul de fata nu exista decat 2 nivele de access RW si RO care sunt la "nivel de aplicatie"... adica cine are drept "RW" in la avea pentru orice form pe care il va deschide... dar voi puteti sa va creati mai multe in asa fel incat sa va puteti "juca" cu permisiunile formularului pentru AllowAdditions, AllowDeletions si AllowEdits .

Deasemenea se poate completa tabela tblUsers si cu numele formularului in asa fel incat sa aveti o combinatie USER-FORM-DREPTURI si astfel puteti da permisiuni diferite pe fiecare form in parte.

3. Si pentru a face formul de LogIn functional inca de la deschiderea bazei de date se foloseste un macro AutoExec pentru ca acesta se va executa la fiecare deschidere a bazei de date (o alta varianta ar fi setarea in proprietatile bazei a unui form de start).
AutoExec-Macro.jpg
Dupa cum se vede, acest macro nu are decat 2 linii

Prima se bazeaza pe conditia Not [CurrentProject].[IsTrusted] adica daca proiectul NU este executat dintr-o zona sigura - va afisa un formular frmStart in care doar i se explica utilizatorului ca trebuie sa activeze continutul ("Enable this content").

Altfel daca proiectul este executat dintr-o zona sigura ([CurrentProject].[IsTrusted]) - se va lansa direct frmLogIn pentru a cere credentialele utilizatorului.

In final la deschiderea bazei de date te va intreba userul si parola si in functie de cei 2 useri de test (admin sau user) poti deschide formularele frmCategorii si frmProduse cu drepturile corespunzatoare.
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

smcsa
Mesaje: 2805
Membru din: Mar Sep 29, 2009 7:29 pm
Localitate: Timisoara

Re: Cum se... creeaza un form de LogOn cu "drepturi de acces"

Mesaj de smcsa » Joi Iul 07, 2011 1:21 pm

Pe baza acestui algoritm se poate construi o functionalitate si mai serioasa, care sa mearga mai departe decat drepturi de operare / vizualizare.
In tabela cu useri (sau in alta separata, legata de prima prin user_id) se pot completa inregistrari care sa permita sau nu selectarea unui control de pe form sau a unei anumite linii din meniu functie de user-ul logat.
De exemplu, intr-o aplicatie complexa ERP, la cei din departamentul contabilitate dau acces doar meniurile legate de notele contabile (unii RW, altii, mai juniori, doar RO, dupa schema prezentata de lucian). La cei din conducere (manageri pe care nu ii intereseaza "bucataria contabila") dau acces doar la meniurile cu rapoarte ce privesc managementul firmei. La departamentul Personal / Salarizare dau acces doar la meniruile care privesc datele personale si de venituri (din nou, unii RW, altii doar RO). Daca user-ul este Directorul economic normal ca va avea acces (aproape) total, peste tot, mai putin meniurile ce tin de administrare, iar daca user-ul este admin, va avea acces total.
Practic, meniurile sau controalele din form-uri se vor construi dinamic la lansarea in executie si, functie de drepturile stabilite pentru aceasta functionalitate, acestea vor fi enabled / disabled sau vizibile / invizibile.
Cele doua functionalitati se pot combina, adica toti contabilii vor vedea DOAR notele contabile, unii putandu-le si modifica. O astfel de grupare si subgrupare a drepturilor de acces SI a drepturilor de operare (membership / roles pe limba americanilor) se poate dovedi foarte utila pe partea de facturare: unii doar vad facturile emise (pentru a cauta ceva, a executa rapoarte), altii emit facturi si altii pot si sa anuleze facturi.

newbie
Moderator
Moderator
Mesaje: 559
Membru din: Mie Mar 09, 2011 9:38 am
Localitate: Tirgu Mures

Re: Cum se... creeaza un form de LogOn cu "drepturi de acces"

Mesaj de newbie » Joi Iul 07, 2011 5:00 pm

Multumim pentru tutorial
Rezolva zeci de intrebari/nelamuriri

newbie
Moderator
Moderator
Mesaje: 559
Membru din: Mie Mar 09, 2011 9:38 am
Localitate: Tirgu Mures

Re: Cum se... creeaza un form de LogOn cu "drepturi de acces"

Mesaj de newbie » Joi Iul 07, 2011 5:44 pm

Si inca 2 aditii la formularul Login
Comanda Cancel se poate modifica astfel incit din close sa devina Close Database ( adica daca nu introduce nici un user si nici o parola se inchide baza de date) Intrati in dessign view - click pe butonul Cancel - Click pe property sheet - Event - On click - selectati [...] si modificati Close (primul rind din Ma.cro ) in CloseDatabase.
2) Daca aveti un formular pe care un user nu trebuie sa il deschida, dar totusi aveti buton in switchboard atunci la onLoand modificati astfel:

Cod: Selectaţi tot

Private Sub Form_Load()
    'Asigura deschiderea formularului in functie de permisiunile utilizatorului
    If [TempVars]![pUserRights] = "RW" Then
        Me.AllowAdditions = True
        Me.AllowDeletions = True
        Me.AllowEdits = True
    Else
        DoCmd.Close
    End If
End Sub
( Scuze smcsa pt furtul si modificarea codului)

smcsa
Mesaje: 2805
Membru din: Mar Sep 29, 2009 7:29 pm
Localitate: Timisoara

Re: Cum se... creeaza un form de LogOn cu "drepturi de acces"

Mesaj de smcsa » Joi Iul 07, 2011 7:02 pm

Nici o problema. Asta pentru ca in cele 2325 de mesaje postate pana acum nu am pus nici un cod pentru Access :lol:

Adrian
Mesaje: 984
Membru din: Joi Sep 03, 2009 12:49 pm

Re: Cum se... creeaza un form de LogOn cu "drepturi de acces"

Mesaj de Adrian » Joi Iul 07, 2011 7:30 pm

in primul rand tin sa va multumesc pentru acest exemplu edificator
Apoi am si eu o sugestie: in locul userului as pune mai degraba IP-ul calculatorului si as aloca parola pe om

smcsa
Mesaje: 2805
Membru din: Mar Sep 29, 2009 7:29 pm
Localitate: Timisoara

Re: Cum se... creeaza un form de LogOn cu "drepturi de acces"

Mesaj de smcsa » Joi Iul 07, 2011 7:38 pm

De ce IP si nu numele din retea al statie sau user-ul de Windows ? Asta ca sa n-ai treaba cu IP-uri dinamice.
Pe de alta parte, mi-a venit o idee: nu s-ar putea prelua credentialele din Windows (user si parola) si folosi pentru login in Access ? Cred ca ar trebui ceva third-party, dar merita studiat / cautat. Pentru server SQL exista (de la mama lui din Redmond), poate reusim (daca nu au facut-o altii deja) si pentru Access

Dr.Windows
Moderator
Moderator
Mesaje: 4570
Membru din: Vin Iul 31, 2009 7:32 am

Re: Cum se... creeaza un form de LogOn cu "drepturi de acces"

Mesaj de Dr.Windows » Joi Iul 07, 2011 7:51 pm

Adrian scrie:Apoi am si eu o sugestie: in locul userului as pune mai degraba IP-ul calculatorului si as aloca parola pe om
In general nu este utilizabila o astfel de abordare pentru toate situatiile - poate in cazul tau este util... numai ca este extrem de incomod pentru un user care isi schimba PC-ul destul de des - de ex. un user care lucreaza la primul PC disponibil din departament, sau ce faci cu ADMIN-ul?... inseamna ca-l limitezi sa foloseasca NUMAI statia lui - si daca i se strica ce faci?... ;)

In plus, asa cum a mentionat si Smcsa daca folosesti IP-uri dinamice iar nu mai merge schema - iar in ziua de astazi cand se promoveaza o mobilitate cat mai mare asta poate fi o "ingradire"... dar poate fi privita si ca o masura de "securitate"...
smcsa scrie:nu s-ar putea prelua credentialele din Windows (user si parola) si folosi pentru login in Access?
Nici nu ai nevoie pentru ca atat timp cat un user "stie" parola de Windows si s-a logat pe sistemul de operare de ce sa mai trebuiasca inca o data parola pentru aplicatie?... doar se preia numele userului dupa exemplul meu initial (din variabila Environment) si gata - doar ca in acest caz NU mai trebuie permisa introducerea utilizatorului ci doar "confirmarea" lui pe ecran.

Eventual poti sa pui o intrebare de genul "Acum veti intra in aplicatie cu userul X. Daca nu acesta este userul dorit faceti Logoff si conectati-va in windows cu userul corect." - dar ideea este sa nu-l mai lasi sa introduca manual numele utilizatorului.

L.E.: Evident in acest caz ar trebui "educati" utilizatorii ca atunci cand pleaca de langa PC sa-l blocheze... ca doar este ff. simplu sa apesi START+L... dar crezi ca o va face cineva?... ;)

smcsa
Mesaje: 2805
Membru din: Mar Sep 29, 2009 7:29 pm
Localitate: Timisoara

Re: Cum se... creeaza un form de LogOn cu "drepturi de acces"

Mesaj de smcsa » Joi Iul 07, 2011 8:01 pm

lucian scrie:de ce sa mai trebuiasca inca o data parola pentru aplicatie?
La asta m-am gandit si eu: odata logat in Windows, cand intra in aplicatie i se da acces pe baza user/pass de Windows. Adica aplicatia il considera "de incredere" pe motiv ca face parte din "familie". Asa lucreaza ASP.NET (una dintre variante, cealalta fiind forms auth, adica cea de la inceputul topicului).

Cat despre blocarea statiei, faci un log si ii demonstrezi. Apoi, la sfarsit de luna, cand va vedea mai putin pe fluturas, sa vezi cum pune lacate sau pleaca la WC cu tastatura :lol:

Dr.Windows
Moderator
Moderator
Mesaje: 4570
Membru din: Vin Iul 31, 2009 7:32 am

Re: Cum se... creeaza un form de LogOn cu "drepturi de acces"

Mesaj de Dr.Windows » Joi Iul 07, 2011 8:11 pm

Bine... ce am spus eu mai devreme nu este chiar ok dpdv al securitatii... pentru ca SQL-ul are grija sa-l identifice cumva in mod foarte exact pe acel user... ;)
O varianta ar fi sa faci o functie care sa citeasca SID-ul utilizatorului, pentru cine nu stie SID inseamna Security IDentifier si este un cod unic de tip GUID (tot pentru cine nu stie sunt codurile alea lungi intre acolade {ABCXXX-NNN....etc}) si care idendifica in mod UNIC un user - astfel ca daca exista un user cu ACELASI nume pe 2 PC-uri diferite el va avea SID-uri diferite (asta in cazul unui workgroup) si tot ca o paranteza, de aia nu mai are aceasi acces la fisiere dupa ce este sters si recreat... pentru ca este ALTUL... ;)

Numai ca in varianta asta cu SIDul se mai complica codul si este greu de gestionat in cazul unui workgroup pentru ca trebuie sa faci toate combinatiile intre SID (user) & SID (PC) adica sa tii cont de toate combinatiile User&PC pe care le poate avea acel user... asa ca dpdv administrativ este curata sinucidere. :P

Închis

Înapoi la “Tips and tricks in Access (indiferent de versiune)”