Formulier beveiligen met wachtwoord en inlognaam

Status
Niet open voor verdere reacties.

dfenjoy

Nieuwe gebruiker
Lid geworden
29 jul 2011
Berichten
4
Ik zou een formulier willen beveiligen dat enkel 1 persoon het kan openen met de juiste inlognaam en wachtwoord.

De bedoeling is dat ik een wachtwoordformulier open alvorens het invulformulier wordt geopend. Dit mag echter maar verschijnen na de juiste gegevens van inlog en wachtwoord. Heb geprobeerd in code bij openen van het invulformulier waar:
Private Sub Form_Current()

DoCmd.OpenForm "Wachtwoord"
form_wachtwoord.txtInlognaam.SetFocus
If txtInlognaam = "persoon" Then
form_wachtwoord.txtwachtwoord.SetFocus
If txtwachtwoord = "2011" Then
MsgBox "Welkom persoon"
End If

DoCmd.Close

Else
'MsgBox "Foutieve gebruikersnaam en/of wachtwoord"
End If
DoCmd.OpenForm "invulformulier"

End Sub

Blijkbaar doe ik één en ander verkeerd.
Kan iemand mij hierin helpen?

Dank
DFenjoy:rolleyes:
 
Ja, je doet wel wat verkeerd; altijd nuttig als de vraagsteller dat zelf al weet :) Om te beginnen (heeft niks met de vraag te maken) is je code niet opgemaakt met de CODE tag (knop). Dat mag je dus de volgende keer (en wat mij betreft met terugwerkende kracht ook voor je vraag) wèl doen... Dan ziet de code er zo uit:

Code:
Private Sub Form_Current()
    DoCmd.OpenForm "Wachtwoord"
    form_wachtwoord.txtInlognaam.SetFocus
    If txtInlognaam = "persoon" Then
        form_wachtwoord.txtwachtwoord.SetFocus
        If txtwachtwoord = "2011" Then
            MsgBox "Welkom persoon"
        End If
        DoCmd.Close
    Else
        MsgBox "Foutieve gebruikersnaam en/of wachtwoord"
    End If
    DoCmd.OpenForm "invulformulier"
End Sub

Dan nu het probleem: een code die je start bij de gebeurtenis OnCurrent wordt bij het openen van het formulier afgevuurd. Helemaal.... Tenzij je tussenstappen inbouwt. Maar dat heb je niet gedaan. Ergo: het formulier opent, zet de focus op het veld txtInlognaam, en constateert dan vermoedelijk dat het tekstveld leeg is. Vervolgens controleer je of het veld de tekst "persoon" bevat. Dat kan dus niet, want wanneer had je dat in moeten vullen? De code loopt gewoon door. En gaat verder bij de Msgbox "Foutieve gebruikersnaam..." En daarna wordt het formulier Invulformulier geopend; het andere formulier wordt niet eens gesloten, want dat gebeurt alleen als er een persoon is ingevuld. En dan heb je de hele code ook nog eens in een reeds geopend formulier staan; daar wordt al helemaal niks mee gedaan verder...
Kortom: zoek in dit forum eerst eens op Inlogformulieren, want dit onderwerp komt een paar keer per maand voorbij, en we hebben ondertussen een prachtige verzameling voorbeelden staan.
 
Het probleem is opgelost:
Option Compare Database


Private Sub cmdInloggen_Click()

'Kijk na of er iets is ingevuld in de keuzelijst van de inlognaam

If IsNull(Me.kzlInlognaam) Or Me.kzlInlognaam = "" Then
MsgBox "Je moet een medewerker invullen.", vbOKOnly, "Titel zelf in te vullen"
Me.kzlInlognaam.SetFocus
Exit Sub
End If

'Kijk of er iets is ingevuld in het wachtwoord tekstvak

If IsNull(Me.txtWachtwoord) Or Me.txtWachtwoord = "" Then
MsgBox "Je bent verplicht om een wachtwoord in te vullen.", vbOKOnly, "Titel zelf in te vullen"
Me.txtWachtwoord.SetFocus
Exit Sub
End If

'Kijk na of de waarde die is ingevuld in het tekstvak wachtwoord overeen komt
'met de waarde in de tabel medewerkers

If Me.txtWachtwoord.Value = DLookup("wachtwoord", "Medewerkers", _
"[medewerkerID]=" & Me.kzlInlognaam.Value) Then

medewerkerID = Me.kzlInlognaam.Value

'Sluit het wachtwoord formulier en open Goedkeuring voor directie

DoCmd.Close acForm, "wachtwoord", acSaveNo
DoCmd.OpenForm "goed te keuren door directie"

Else
MsgBox "Verkeerd wachtwoord. Probeer opnieuw aub.", vbOKOnly, "Titel zelf in te vullen"
Me.txtWachtwoord.SetFocus
End If

'De medewerker kan tot 3 maal proberen, anders sluit de database af

intLogonAttempts = intLogonAttempts + 1
If intLogonAttempts > 3 Then
MsgBox "Je krijgt geen toegang tot de database. Neem contact op met administrator.", _
vbCritical, "Titel zelf in te vullen"
Application.Quit

End If
End Sub

Private Sub kzlInlognaam_AfterUpdate()

'Na het kiezen van de naam wordt de focus naar het wachtwoord veld geplaatst.
Me.txtWachtwoord.SetFocus

End Sub

Er is nog één ding dat ik zou moeten kunnen regelen.
Het formulier voor "goedkeuring door directie" zou niet toegankelijk mogen zijn door er gewoon op te klikken.
Ik zou dus een melding wensen dat verwijst naar het wachtwoord formulier en de toegang zonder dit niet mogelijk is.

Nog iemand een idee?

Dank je wel

Dfenjoy
 
Je kunt om te beginnen het Databasevenster blokkeren bij de opstartinstellingen, en de sneltoetsen. Als je alle standaard toegangsinstellingen uitzet, en het inlogformulier als startscherm instelt, kun je alleen maar via het formulier in de db. Je kunt dan ook geen andere objecten zoals formulieren en tabellen openen. Dit geldt dan ook voor de administrator van de db, dus die moet de db dan openen met de <Shift> toets ingedrukt; dan krijg je weer toegang tot alle objecten.
Wil je voorkomen dat iemand met de <Shift> toets de db opent (er zijn genoeg mensen die die combinatie weten) dan moet je dat ook afschermen met een wachtwoord. Andere optie is, om de inlognaam vast te leggen in een Public variabele, en daar een check op te doen. Maar dat is nogal ingewikkeld te programmeren, omdat het formulier uiteraard wel geopend mag worden vanuit het startscherm.

P.S. Ik zie dat je de CODE knop nog niet gevonden hebt :D
 
Ik heb toevallig kort geleden een compleet custom login systeem gemaakt.

Hier word gebruik gemaakt van de Windows inlog naam

Code:
=FOSUsername

Maar het kan ook met een zelf verzonnen username en wachtwoord.

Features die mijn login systeem heeft :

* apart inlogscherm.

* Users kunnen zelf hun wachtwoord veranderen

* Database beheerder kan mensen een bevoegdheid mee geven en dus beslist hij wat zijn users kunnen doen met de database.

* Database beheerder kan iemand autoriseren tot een bepaalde datum (of onbepaald). Waarbij de user gewaarschuwd word hoe veel dagen hij nog over heeft om in de database te werken.

* User heeft drie kansen om in te loggen, En word op de hoogte gehouden van het aantal pogingen welk hij gebruikt heeft. Ook als hij de database sluit en weer start word dit onthouden. Bij een succesvolle inlog word dit aantal reset.
Als het aantal van drie is bereikt kan hij er niet meer in, ook niet met het juiste wachtwoord.

* Er word een login trace bijgehouden, waarbij de database beheerder kan zien wie heeft ingelogd (Windows username, of custom username), wanneer, op welke computer, en of de login succesvol was of niet.

* Users kunnen de database niet openen met F11 of shift.

Als je geinteresseerd bent in ��n van de functies, laat me het even weten dan help ik je op weg.
 
Beste JeroenMioch,

Het zou inderdaad handig zijn mocht u dit willen delen.
Als beginnende access ontdekker is alle hulp welkom.

Als het mogelijk is om een gecomprimeerd bestandje te oploaden... nog fijner.

Met dank,

DFenjoy
 
Een voorbeeld posten dat lukt helaas niet. Maar ik kan je wel op weg helpen.

Je hebt zo te zien een tabel "Medewerkers"
Zorg dat deze tabel de volgende velden heeft :

Groep, Wachtwoord (selecteer bij invoermasker "wachtwoord"), bevoegdheid, einddatum (datum veld), InlogCount

Hou er rekening mee dat je alle verwijzingen naar velden of tabellen in mijn codes moet veranderen naar je eigen veld of tabelnamen. Zo heet bijvoorbeeld jou tabel "medewerkers" bij mij "InlogMenu".

Het inloggen gebeurd bij mij in een formulier genaamd "frmCalamityInlogscherm" en heeft de volgende velden :

fldComputerNaam, CBOinlogNaam, FLDwachtwoordInvoeren
en een knop om in te loggen genaamd KNPinloggen
Het eerste veld laat zien op welke computer we zitten. zet in de eigenschappen van het veld bij besturingselementbron =fOSMachineName()
Het tweede veld is de inlog naam, In mijn geval is dat het netwerk inlognaam. Zet in de eigenschappen van van het veld bij besturingelementbron =FOSUsername()
Bij het derde veld zetten we geen besturingselementbron, die kan je dus gewoon zo laten. Maar selecteer wel bij invoermasker "wachtwoord"

Selecteer de knop KNPinloggen en kies voor eigenschappen, selecteer "bij klikken" opbouwfuncties voor programmacode.

Copy en paste de volgende code hierin :

Code:
Private sub KNPinloggen_click()
Dim EindDatum As Variant
Dim intDaysUntilPwdExpire As Integer
Dim intInlogCount As Integer

'------CHECK of WACHTWOORD ingevuld is---------'

If Len(Nz(Me!FLDwachtwoordInvoeren, "")) = 0 Then
   MsgBox "Wachtwoord moet ingevuld zijn", _
      vbInformation, "Wachtwoord melding"
         Me.FLDwachtwoordInvoeren.SetFocus
       Exit Sub
    End If

                   
'-------Check of drie inlogpogingen zijn overschreden----------'

If DLookup("[inlogcount]", "tblinlogMenu", "[Groep] = '" & Me![CBOinlogNaam] & "'") = 0 Then
   MsgBox "Aantal inlog pogingen is overschreden " _
      & vbCrLf & "Neem contakt op met de Database beheerder", vbExclamation, "Inloggen mislukt"
         Exit Sub
      Else
   End If
                   
'------CHECK of PASSWORD verlopen is------'

EindDatum = DLookup("[EindDatum]", "tblinlogMenu", "[Groep] = '" & Me![CBOinlogNaam] & "'")
   If Not IsNull(EindDatum) Then
      intDaysUntilPwdExpire = DateDiff("d", Now(), CDate(EindDatum))
         Select Case intDaysUntilPwdExpire
            Case Is <= 0
               MsgBox "You Password is exprired, please " _
                 & vbCrLf & "Neem contakt op met de Database beheerder", vbExclamation, "Password Expiration Notice"
                    Exit Sub
            Case Is <= 30
               MsgBox "You Password will expire in " & _
                  intDaysUntilPwdExpire & " days" _
                     & vbCrLf & "Neem contakt op met de Database beheerder", vbExclamation, "Password Expiration Notice"
            Case Else
         End Select
     Else
  End If
            
'------CHECK of USERNAME en PASSWOORD klopt------'
If Me.FLDwachtwoordInvoeren = DLookup("wachtwoord", "TBLinlogMenu", "Groep = '" & Me.CBOinlogNaam.Value & "'") Then
       DoCmd.SetWarnings False
            Dim strSQL As String
                strSQL = "Update TBLinlogMenu Set InlogCount = 3 Where Groep = '" & Me.CBOinlogNaam.Value & "'"
                     DoCmd.RunSQL strSQL
                           DoCmd.Close
                                DoCmd.OpenForm "frmWelkomScherm2"
                                      End With
                                          Exit Sub
Else
'---------Als Username & Passwoord niet klopt >> --------'

Me.FLDwachtwoordInvoeren = ""
   DoCmd.GoToControl "FLDwachtwoordInvoeren"
      Me.Requery
         strSQL = "Update TBLinlogMenu Set InlogCount = InlogCount -1 Where Groep = '" & Me.CBOinlogNaam.Value & "'"

intInlogCount = DLookup("[inlogcount]", "tblinlogMenu", "[Groep] = '" & Me![CBOinlogNaam] & "'")
   If Not IsNull(InlogCount) Then
      Select Case intInlogCount
         Case Is = 0
            MsgBox "Aantal inlog pogingen is overschreden " & _
               "Neem contakt op met de Database beheerder", vbExclamation, "Inloggen mislukt"
                  Exit Sub
         Case Is = 1
            MsgBox "Het wachtwoord is niet juist" _
               & vbCrLf & "U heeft nog " & intInlogCount & " Poging over", vbExclamation, "Inloggen mislukt"
                     
         Case Is = 2
            MsgBox "Het wachtwoord is niet juist" _
               & vbCrLf & "U heeft nog " & intInlogCount & " Pogingen over", vbExclamation, "Inloggen mislukt"
         
         Case Is = 3
            MsgBox "Het wachtwoord is niet juist" _
               & vbCrLf & "U heeft nog " & intInlogCount & " Pogingen over", vbExclamation, "Inloggen mislukt"
         Case Else
      End Select
   Else
End If
Exit Sub
End If
End Sub

Mijn scherm ziet er zo uit trouwens :

Inloggen.JPG


Maak even een nieuw formulier aan genaamd frmWelkomScherm2 om te zien of het werkt. In dit formulier heeft de gebruiker de mogelijkheid zijn eigen passwoord te veranderen, de database te openen, en de manager heeft hier de mogelijkheid om het passwoord management pagina te openen.

Ik heb voor het gemak even het stukje eruitgelaten waar word gelogd wie inlogged en wanneer, dat komt later wel. Probeer dit eerst maar even.
 
Laatst bewerkt:
Een voorbeeldje is uiteraard wel te maken; deze wordt redelijk vaak gebruikt op het forum. Ik heb alleen de inlogkant gemaakt, de db zelf is nog redelijk open, zodat je er zelf nog wat mee kunt stoeien.
De Login procedure werkt als volgt:

- In de tabel [Tbl_Users] leg je de toegangsniveau's vast van de gebruikers, + hun wachtwoord + de datum waarop het wachtwoord verloopt.
- Je krijgt 3 pogingen om in te loggen, daarna wordt de db afgesloten.
- Het wachtwoord is hoofdlettergevoelig.
- Als het wachtwoord is verlopen, moet je eerst het wachtwoord veranderen.

Op basis van de toegangsrechten wordt het hoofdscherm ([Frm_switchboard]) opgebouwd.

Kijk maar eens of je er wat uit kunt halen.
Om te testen kun je elke gebruiker nemen; het wachtwoord is gelijk aan de voornaam. (hoofdlettergevoelig dus :) )
 

Bijlagen

Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan