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
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ść.
Możesz podać więcej szczegółów, bo to nie powinno być zależne od systemu, a od samego access-a
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
Nie mam w tej chwili mozliwości przetestować tego na Viście, a w debugu coś się dzieje?
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
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
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ę:
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…
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!
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
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.
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:)
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?