Formularz Logowania

Temat pisany dzięki inspiracji z forum coderscity.pl. Rzeczywiscie część osób może mieć problem ze stworzeniem formularza logowania i zapamiętaniem użytkownika, który się zalogował.

Rozwiązanie

Stwórzmy tabelę login z dwoma polami login i pass, gdzie trzymać będziemy dane do logowania.

Trzymanie w bazie haseł w postaci czystego tekstu nie jest najlepszym rozwiązaniem. Dlatego posłużę się klasą clsMD5 do wyliczenia MD5.
Użyta klasa jest dostępna pod adresem: http://pastebin.com/AA7d7ewL i jest autorstwa Phila Fresle. W przykładzie obaj użytkownicy: admin i user mają hasło test

Dodajmy moduł globalny modGlobal w którym zadeklarujemy zmienną globalną usrName i funkcje GetUsrName do pobrania tej zmiennej:
(Przykład użycia GetUsrName jest w formularzu frmInfo, można jej użyć też w makrze danych w wersji 2010)

Option Compare Database
Option Explicit

Global usrName As String

Public Function GetUserName() As String
    GetUserName = usrName
End Function

Teraz właściwie nie pozostaje nic innego jak stworzyć formularz logowania, z dwoma polami tekstowymi i przyciskiem loguj.
Tutaj kilka uwag:
– w menu narzędzia -> uruchomienie… dodajemy ten formularz jako startowy
– warto wyłączyć możliwość zamknięcia tego formularza poprzez przycisk X
– mozna też ukryć wszystkie paski menu przy starcie tego formularza, aby bez zalogowania użytkownik nie mógł podjąć się żadnej akcji

Kod do logowania może wyglądać następująco:

Private Sub btnLoguj_Click()
    Dim md5 As clsMD5
    Dim sql As String
    Dim rsUsr As DAO.Recordset

    If Len(Nz(Me.txtLogin, "")) > 0 And Len(Nz(Me.txtPass, "")) > 0 Then
        Set md5 = New clsMD5
        sql = "select * from login where login = """ & Me.txtLogin & """ and pass = """ & md5.md5(Me.txtPass) & """"
        Set md5 = Nothing
        Set rsUsr = CurrentDb.OpenRecordset(sql)
        If Not rsUsr.EOF Then
            rsUsr.MoveFirst
            usrName = rsUsr!login
            DoCmd.Close acForm, Me.Name
            DoCmd.OpenForm "frmInfo"
        Else
            MsgBox "Niepoprawne dane logowania!", vbInformation + vbOKOnly, "Logowanie"
            Me.txtPass = ""
            Me.txtLogin = ""
            Me.txtLogin.SetFocus
        End If
        rsUsr.Close
        Set rsUsr = Nothing
    Else
        MsgBox "Podaj dane do logowania!", vbOKOnly + vbInformation, "Logowanie"
    End If
End Sub

Podsumowanie

To może być początek budowania systemu logowania. Właściwie to przy rozbudowaniu programu użytkownik “powinien być” obiektem, co byłoby zdecydowanie bardziej elastyczne. Dla zainteresowanych link do przykładowej bazy

Aktualizacja

Jako, że może to sprawić problem postanowiłem dodać wersje logowania w wersji 2010, która rozszerza wcześniejszy przykład kto kiedy modyfikował rekord

Leave a comment ?

22 Comments.

  1. Witam
    Jest mały problem z formularzem logowania w Accessie 2010 na platformie Vista (po prostu nie działa) natomiast na XP i win7 działa poprawnie.
    Takiego rozwiązania zabezpieczenia swojej aplikacji w accessie szukałem od dawna.
    Pozdrawiam i czekam na wiadomość.

  2. Po wisaniu logingu i hasła i naciśnięciu OK nie pojawia się formularz frmInfo. Tak się dzieje na Viście. W XP i win7 jest OK

  3. OK poczekam, tyle czekałem na takie rozwiązanie jak formularz logowania a szczególnie na możliwości jakie daje jeśli chodzi o zabezpieczenie aplikacji od wewnątrz i nadanie uprawnień użytkownikom do poszczególnych części po zalogowaniu. Na XP i win7 aplikacja dzieła poprawnie i tego na razie będę się trzymał.
    Pozdrawiam

  4. Witam. Mam kłopot, pewnie błahy, ale ponieważ to moje początki z Acc to jeszcze sporo prostych błędów popełniam. Chodzi o to, że zupełnie nie wiem jak dodać nowego użytkownika i hasło do systemu logowania.

    • Wiesław ja też nie wiem, bo nie wiem czego używasz…

      • Przepraszam, oczywiście mówię o formularzu logowania zamieszczonym tutaj na blogu w wersji 2010.

        • Trzeba dopisać w tabeli login, a nastepnym razem komentowac pod odpowiednim postem….

          • Oczywiście przepraszam za umieszczenie posta nie tam gdzie trzeba, ale ka już tutaj zacząłem to dopytam do końca. Oczywiście najpierw dopisałem nowego użytkownika właśnie w tabeli login, ale po próbie zalogowania otrzymuję komunikat “niepoprawne dane logowania” Nadmienię że hasło, które tam wpisuję wyświetla się w tabeli tak jak je wpisuję, a nie tak jak przykładowe hasło test, które ma w tabeli zupełnie inną postać.

          • Bo hasło musi być w postaci skrótu MD5

  5. Bardzo dobrze to wygląda, tylko nie wiem dlaczego nie działa? Po wpisaniu poprawnych danych (login i hasło) skopiowanych z tabeli “login” zwraca “Niepoprawne dane logowania!”, czyli nie znajduje poprawności dla:

    If Not rsUsr.EOF Then
    rsUsr.MoveFirst
    usrName = rsUsr!login
    DoCmd.Close acForm, Me.Name

    Niestety, nie wiem dlaczego.
    Aha, testowane na Access 2007

    • Nie wiem co wpisujesz ale w celu diagnozy zrób tak:
      Przed tym ifem dopisz linijkę:

      Debug.Print sql

      I zobacz o co on tak naprawdę pyta w warunku where, skoro kopiowałeś z tabeli hasło w postaci hash-a to błąd, oba maja hasło “test” jak napisane jest w poście…

  6. sorry tego nie doczytałem, że hasło jest zahashowane. Wszystko działa ok.
    Chyba najlepszy przykład systemu logowania jaki znalazłem w sieci.
    Wielkie dzięki!

  7. Tak, jak wcześniej napisałem – świetny system logowania. Proponuję wzbogacić go o możliwość rejestracji nowego użytkownika, ewentualnie o możliwość zmiany hasła przez użytkownika, w przypadku nadawania loginu i hasła z poziomu programisty (tak jak jest to teraz).

    • jestem totalnym nowicjuszem i nie bardzo wiem jak wykorzystać klase MD5 do wygenerowania hasha dla haseł kolejnych użytkowników??

      • Przykład np. tak

        Dim md5 As clsMD5
         Set md5 = New clsMD5
         recordset.PoleHasla = md5.md5("tajnehasło")
         Set md5 = Nothing
        • Dim md5 As clsMD5
          Set md5 = New clsMD5
          recordset.PoleHasla = md5.md5(“tajnehasło”)
          Set md5 = Nothing

          A co mam umieścić w “PoleHasla”.
          Jestem początkującym użytkownikiem access.
          Cały czas mam komunikat:
          Run-time error ‘91’:
          Object variable or with block variable not set

          • Radek,

            To jest przykład obrazujący jak użyć klasy do zapisania hasła, musisz go rozbudować:
            1. recordset to zmienna recorsetu w której masz otwartą tabelę z użytkownikami i hasłami.

            2. PoleHasla to pole w tabeli w którym to hasło jest przechowywane.

  8. Poradziłem sobie z tym. Użyłem do tego kwerendy gdzie w kryterium dla Loginu użytkownika dałem UserName(). Potem zrobiłem z niej oddzielny formularz i ukryłem pole z hasłem. nastepnie dodałem przycik pod który podłączyłem kod:
    Private Sub ZmianaHasla_Click()
    Dim md5 As clsMD5
    Dim strPass As String

    strPass = InputBox(“Podaj nowe hasło dla uzytkownika: ” & Me.login, “Hasło”)

    Set md5 = New clsMD5

    Me.pass = md5.md5(strPass)

    Set md5 = Nothing
    DoCmd.RunCommand acCmdSaveRecord
    MsgBox (“Hasło zostało zmienione”)
    DoCmd.Close acForm, “ZmianaHasla”
    DoCmd.OpenForm “frmLogowanie”
    End Sub
    I wszystko smiga aż miło:)

  9. Witam. Jestem nowicjuszem w programowaniu Access więc problem, w rozwiązaniu którego potrzebuję pomocy może być dla fachowców banalny. W access 2010 próbując założyć uprawnienia dla uzytkowników nie wiem co sie stało ale zablokował mi się tak program, że żąda logowania za każdym razem nawet przy próbie otwarcia nowej bazy. Niestety nie znam ani logina ani hasła, które by to odblokowało. Bazy danych na innym kompach otwierają sie bez problemu. Nawet przeistalowałem Office-a i nic nie pomogło. Spodziewam się, że jest to sprawa wpisu w jakiś rejestrach. Czy ktoś może pomóc mi?

Reply to MontZbi ¬
Cancel reply

NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Trackbacks and Pingbacks:

WordPress SEO fine-tune by Meta SEO Pack from Poradnik Webmastera
Skip to toolbar