Każdy przyzwoity program, z którego korzysta kilka osób, powinien mieć możliwość rozpoznawania zarówno użytkowników, jak i ich ograniczenia. Oczywiste jest, że użytkownik z typem „user” nie będzie miał takich praw jak Administrator. Wiązałoby się to z problemami, które zwykły użytkownik mógłby spowodować swoją ograniczoną wiedzą na temat działania programu. Dzisiaj zrobimy sobie właśnie taką formę logowania. Zaczniemy od nowego projektu. Pierwsza forma będzie rejestrowała użytkowników. Aby tego dokonać, dodamy sobie bazę danych.
Wybieramy „Dodaj” a następnie przechodzimy dalej, głównie przyciskając „Next”. Teraz po lewej stronie w „Eksplorator baz danych” rozwijamy naszą bazę danych i klikając prawym przyciskiem myszy na folder „Tables” wybieramy „Create Table”
Jeśli po lewej stronie nie wyświetla wam się zakładka „Eksplorer baz danych” należy ją odszukać w głównym menu programu „Widok” i po prostu ją dodać.
Po przyciśnięciu „Create Table” powinien pojawić się nam kreator Tabeli. Ja wypełniłem go tak jak na obrazku.
Dla pozycji „Login” dałem klucz, co zapobiegnie tworzeniu dwóch takich samych loginów. Rozwijamy teraz „Źródła danych” i wybieramy opcje „Edytuj obiekty DataSet przy pomocy projektanta”
Powinno pojawić się puste pole. Klikamy prawym przyciskiem myszki i wybieramy „Dodaj”>>”TableAdapter..”
Przechodzimy kreator konfiguracji TableAdapter, na końcu wybierając konstruktora zapytań albo samemu tworząc zapytanie.
Po wyborze konstruktora wybieramy naszą tabelę „logi” i fajkujemy wszystkie kolumny w tabeli tak jak na obrazku:
Potwierdzamy „Ok” i „Zakończ”. Teraz mamy gotową tabelę.
Wracamy do naszej formy. Jak pisałem wcześniej, zrobimy sobie najpierw formę rejestracji, a następnie resztę. Po otwarciu formy rozwijamy znowu „Źródła danych” i zmieniamy elementy źródła tak jak na obrazkach:
Przenosimy nasze logi na formę, u mnie wyglądało to tak:
Usuwamy nawigator z góry i dodajemy dwa przyciski.
Otwieramy kod naszej formy. Najpierw zaimportujemy dwa elementy:
1 2 |
Imports System.Text Imports System.Security.Cryptography |
Pod Public Class Form dodajemy
1 2 3 4 5 6 7 8 9 10 11 |
Imports System.Text Imports System.Security.Cryptography Public Class Form1 Dim md5Hasher As New MD5CryptoServiceProvider() Dim hashedPassword As Byte() Dim encoder As New UTF8Encoding() Public harsh As String (...) |
Co daje nam MD5CryptoServiceProvider otórz opcja ta dodatkowo koduje nam nasze hasło tak aby ktoś kto zdobędzie naszą bazę danych albo sprytny user nie podejrzał go w bazie danych. Do „Form1_Load” dodajemy „Me.LogiBindingSource.AddNew()”
1 2 3 4 5 |
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'TODO: Ten wiersz kodu wczytuje dane do tabeli 'LoginDataSet.Logi' . Możesz go przenieść lub usunąć. Me.LogiTableAdapter.Fill(Me.LoginDataSet.Logi) Me.LogiBindingSource.AddNew() End Sub |
Dodajemy uchwyt do przycisku „Zarejestruj” i wypełniamy go kodem:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click hashedPassword = md5Hasher.ComputeHash(encoder.GetBytes(HasloTextBox.Text)) harsh = Convert.ToBase64String(hashedPassword) HasloTextBox.Text = harsh Me.LogiBindingSource.EndEdit() Me.TableAdapterManager.UpdateAll(Me.LoginDataSet) Me.LogiTableAdapter.Update(Me.LoginDataSet.Logi) MsgBox("Dodano nowego użytkownika") Me.LogiBindingSource.AddNew() End Sub |
Teraz można jeszcze usunąć Suba „Private Sub LogiBindingNavigatorSaveItem_Click” już się nie przyda. Ostatecznie pełen kod wygląda tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Imports System.Text Imports System.Security.Cryptography Public Class Form1 Dim md5Hasher As New MD5CryptoServiceProvider() Dim hashedPassword As Byte() Dim encoder As New UTF8Encoding() Public harsh As String Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'TODO: Ten wiersz kodu wczytuje dane do tabeli 'LoginDataSet.Logi' . Możesz go przenieść lub usunąć. Me.LogiTableAdapter.Fill(Me.LoginDataSet.Logi) Me.LogiBindingSource.AddNew() End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'dodatkowo koduje nasze hasło hashedPassword = md5Hasher.ComputeHash(encoder.GetBytes(HasloTextBox.Text)) harsh = Convert.ToBase64String(hashedPassword) HasloTextBox.Text = harsh 'dodaje hasło do bazy danych Me.LogiBindingSource.EndEdit() Me.TableAdapterManager.UpdateAll(Me.LoginDataSet) Me.LogiTableAdapter.Update(Me.LoginDataSet.Logi) MsgBox("Dodano nowego użytkownika") Me.LogiBindingSource.AddNew() End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Me.Close() End Sub End Class |
W Textboxie można zmienić sposób wyświetlania się wpisu na „*”
a do ComboBoxa dodajemy elementy:
Wybieramy „Ok” i formę rejestracji mamy już zrobioną, czy działa, trzeba to sprawdzić. Odpalamy, mi po odpaleniu udało się zarejestrować nowego użytkownika bez problemu:
Po dodaniu „DataGrid” widzimy dokładnie, jak zmienia się nasze hasło. Po wpisaniu w pole hasła: 'visual’ , otrzymałem:
Jak widzimy hasło jest nieczytelne, visual = HftrmK7zQW4D1Q/S+1JWAA==
Dodamy sobie teraz formę powitalną, która będzie pojawiała się po pozytywnym zalogowaniu. Chwilowo nic w niej nie będziemy robić, ale musi ona być dodana.
Ja dodałem przycisk który kieruje nas do „Form1”, więc w „Form1” przycisk „Powrót” przekierowałem na „Form2”.
W zakładce „Projekt” znajdujemy formularz logowania i dodajemy ją do projektu:
Ja w miejsce tego obrazka wstawiłem swój. Wracamy do źródła danych, może to zabrzmi głupio, ale przeciągamy nasze źródło na formę.
Jak widzimy, pojawiły nam się dwa obiekty „Datagrid” i „BindingNavigator”. Teraz rozwijamy mały trójkącik w prawym górnym rogu i wybieramy „Dodaj zapytanie”
Otworzy nam się okno, w którym wpiszemy sobie sekwencje naszego zapytania.
1 2 3 |
SELECT Login, Haslo, TypUzytkownika FROM Logi WHERE (Login LIKE @login) AND (Haslo LIKE @haslo) |
Po wprowadzeniu zapytania pojawi nam się pod „BindingNavigator” nowy element „ToolStripe” z dwoma textboxami. Służą one do wyszukiwania, jeśli po wpisaniu w te textboxy w naszym przypadku „Loginu” i „hasła” będzie taki element w bazie danych istniał, pojawi się on w Tabeli.
Kasujemy teraz „Chart” , „BindingNavigator” i „ToolStripe”. Zaznaczając i wciskając „Delete” na klawiaturze albo prawym i usuń. Tak naprawdę interesują nas tylko elementy dodane przez program na dole ekranu:
Na koniec dopasowujemy formę do jej pierwotnego stanu. U mnie po tej operacji wyglądało to tak:
Otwieramy kod formy i możemy zauważyć, że zrobił się trochę bałagan. Mamy dwie pozycje bez uchwytów, pierwszą:
1 2 3 4 5 6 |
Private Sub LogiBindingNavigatorSaveItem_Click(sender As Object, e As EventArgs) Me.Validate() Me.LogiBindingSource.EndEdit() Me.TableAdapterManager.UpdateAll(Me.LoginDataSet) End Sub |
Kasujemy, nie przyda się nam, także ten tekst na zielono można usunąć. Drugi element będzie bardziej pomocny:
1 2 3 4 5 6 7 8 |
Private Sub FillByToolStripButton_Click(sender As Object, e As EventArgs) Try Me.LogiTableAdapter.FillBy(Me.LoginDataSet.Logi, LoginToolStripTextBox.Text, HasloToolStripTextBox.Text) Catch ex As System.Exception System.Windows.Forms.MessageBox.Show(ex.Message) End Try End Sub |
Wypełnia on nasz „TabeleAdapter ” potrzebnymi nam składnikami. Tak naprawdę nie potrzebowaliśmy „Charta” do wizualizacji naszych użytkowników, jeśli użytkownicy o podanym loginie i haśle zostaną odnalezieni, zostaną oni dodani do naszego „TableAdaptera” a więc wystarczy po naciśnięciu „Ok” kazać programowi sprawdzić, czy nasz „TableAdapter” nie jest pusty. Na samej górze dodajemy:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Imports System.Text Imports System.Security.Cryptography Public Class LoginForm1 Dim md5Hasher As New MD5CryptoServiceProvider() Dim hashedPassword As Byte() Dim encoder As New UTF8Encoding() Public harsh As String Public SuperAdmin As Boolean Public Admin As Boolean Public User As Boolean (...) |
Będziemy potrzebowali rozszyfrować nasze hasło i sprawdzić jakie uprawnienia ma nasz użytkownik. Następnie będziemy musieli sprawdzić, czy nasz użytkownik wypełnił wszystkie wymagane pola po naciśnięciu „OK”:
1 2 3 4 5 6 7 8 9 10 11 |
Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click checking() End Sub Private Sub checking() If String.IsNullOrEmpty(UsernameTextBox.Text) Or String.IsNullOrEmpty(PasswordTextBox.Text) Then MsgBox("Wypełnij wszystkie pola", MsgBoxStyle.Exclamation) Else login() End If End Sub |
Jak widzicie, po wypełnieniu wszystkich pól wykonywana jest metoda „login()”. Najpierw musimy przełożyć tekst z pola hasło na nasz zakodowany wcześniej tekst. Następnie będziemy potrzebowali danych ze skasowanego wcześniej ToolStripa.
1 2 3 4 5 6 7 8 9 10 |
Private Sub login() hashedPassword = md5Hasher.ComputeHash(Encoder.GetBytes(PasswordTextBox.Text)) harsh = Convert.ToBase64String(hashedPassword) Try Me.LogiTableAdapter.FillBy(Me.LoginDataSet.Logi, UsernameTextBox.Text, harsh) Catch ex As System.Exception System.Windows.Forms.MessageBox.Show(ex.Message) End Try End Sub |
Jak widać kod trochę zmieniony:
1 2 3 4 |
'stary Me.LogiTableAdapter.FillBy(Me.LoginDataSet.Logi, LoginToolStripTextBox.Text, HasloToolStripTextBox.Text) 'nowy Me.LogiTableAdapter.FillBy(Me.LoginDataSet.Logi, UsernameTextBox.Text, harsh) |
Możemy sobie teraz ten „FillByToolStripButton_Click” usunąć już się nie przyda. Dobra teraz czas na weryfikacje. Do naszego kodu dodajemy warunek if, całość będzie wyglądać tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Private Sub login() hashedPassword = md5Hasher.ComputeHash(Encoder.GetBytes(PasswordTextBox.Text)) harsh = Convert.ToBase64String(hashedPassword) Try Me.LogiTableAdapter.FillBy(Me.LoginDataSet.Logi, UsernameTextBox.Text, harsh) 'sprawdza ilość odnalezionych wierszy If Me.LogiBindingSource.Count.ToString = 1 Then Dim text As String = Me.LoginDataSet.Logi.Rows(0).Field(Of String)(2) 'sprawdza typ użytkownika If text = "Admin" Then Admin = True ElseIf text = "User" Then User = True ElseIf text = "SuperAdmin" Then SuperAdmin = True End If Form2.Show() Else MsgBox("nie odnaleziono uzytkownika") End If Catch ex As System.Exception System.Windows.Forms.MessageBox.Show(ex.Message) End Try End Sub |
Teraz do „form load” dodamy sobie kod, który da nam możliwość podczas pierwszego uruchomienia zarejestrować pierwszego użytkownika, wygląda on tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Private Sub LoginForm1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'TODO: Ten wiersz kodu wczytuje dane do tabeli 'LoginDataSet.Logi' . Możesz go przenieść lub usunąć. Me.LogiTableAdapter.Fill(Me.LoginDataSet.Logi) If Me.LoginDataSet.Logi.Count = 0 Then MsgBox("to jest pierwsze uruchomienie programu. Musisz przejść do panelu rejestracji aby zarejestrować nowego uzytkownika.", MsgBoxStyle.YesNo) If MsgBoxResult.Yes Then Form1.Show() Else Me.Close() End If End If End Sub |
Ostatecznie mój kod wyglądał tak:
Sprawdzi on czy nasza baza „Logi” jest pusta, jeśli tak zada pytanie użytkownikowi i pozwoli mu przejść do rejestracji bez logowania. Teraz sprawdzimy sobie, czy wszystko działa. Otwieramy jeszcze ustawienia naszego projektu i zmieniamy formularz początkowy na: „LoginForm1”
Większość już mamy zrobione. Teraz odpalamy program.
U mnie wszystko działało dobrze. Najpierw pojawił się komunikat, potem zarejestrowałem użytkownika i się zalogowałem. Teraz zajmiemy się naszą drugą formą, tą główną naszego programu (form2) w strefie Load wpisujemy (Ja dodałem jeszcze do niej Label1 w lewym górnym rogu).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load If LoginForm1.Admin = True Then MsgBox("Witaj Admin", MsgBoxStyle.Information) Label1.Text = "Admin" LoginForm1.Hide() LoginForm1.Admin = False Button1.Enabled = False ElseIf LoginForm1.User = True Then MsgBox("Witaj User", MsgBoxStyle.Information) Label1.Text = "User" LoginForm1.Hide() LoginForm1.Admin = False Button1.Enabled = False ElseIf LoginForm1.SuperAdmin = True Then MsgBox("Witaj SuperAdmin", MsgBoxStyle.Information) Label1.Text = "SuperAdmin" LoginForm1.Hide() LoginForm1.Admin = False End If End Sub |
Należy teraz tylko dodać uchwyt dla naszego przycisku „Rejestrującego użytkowników” klikamy w projektancie na niego dwukrotnie i wpisujemy kod, który otworzy formę rejestrującą użytkowników, czyli „Form1.show()”:
1 2 3 |
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Form1.Show() End Sub |
Wszystko działa:
Po dodaniu zwykłego usera też wszystko wygląda dobrze.
Po zalogowaniu się „emil” nie ma takich praw jak „SuperAdmin”
Na pewno rzuci wam się w oczy, że po wciśnięciu „x” zamykając formę, nasza forma się nie zamyka. Winna jest nasza forma LoginForm1, która tak naprawdę nie jest zamykana a ukrywana metodą Me.Hide(). Aby podczas zamykania naszej głównej formy, czyli „Form2” zamknęła się i LoginForm1 należy w Zdarzeniach „Form2” namierzyć „FormClosing” i dodać suba:
1 2 3 |
Private Sub Form2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing LoginForm1.Close() End Sub |
To podczas zamykania naszej formy2 zamknie i LoginForm1.
Pełen program można pobrać tutaj: Login_form
[error]Jeśli nie będziecie mogli się zalogować, na projekt powyżej spróbujcie zmienić w „My Project” formę startową na Form1 i dodać użytkownika następnie ponownie zmienić na LoginForm[/error]