Jim Clinton Ответов: 1

Как авторизировать пользователей для VB.NET с MS ACCESS?


Когда я выбрал "администратор" из выпадающего списка, он вошел в систему напрямую, без ввода имени пользователя и пароля. пожалуйста, помогите!!

Вот мои коды:

Public Class frmLogin
    Dim sqlcode As String
    Dim connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Jim Clinton Amarga\Desktop\Class Records\Class Records\bin\Debug\dbClassRecords.accdb"
end class

Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
 If cmbLoginType.Text = "Administrator" Then

 Dim sqlLoginCode As String = "select * from tblusers where User_username = '" & txtUsername.Text & "' AND User_password = '" & txtPass.Text & "' AND User_usertype = '" & "Administrator" & "' "
            Dim loginCommand As New OleDb.OleDbCommand(sqlLoginCode)
            loginCommand.Connection = New OleDb.OleDbConnection(connstring)


            loginCommand.Connection.Open()
            loginCommand.ExecuteNonQuery()
            Dim da As New OleDb.OleDbDataAdapter(loginCommand)

            Dim ds As New DataSet


            da.Fill(ds, "tblusers")

            MessageBox.Show("Welcome Admin")
            frmAdmin.Show()
            Me.Hide()

        ElseIf cmbLoginType.Text = "Teacher" Then

            Dim sqlLoginCode As String = "select * from tblusers where User_username = '" & txtUsername.Text & "' AND User_password = '" & txtPass.Text & "' AND User_usertype = '" & "Teacher" & "' "
            Dim loginCommand As New OleDb.OleDbCommand(sqlLoginCode)
            loginCommand.Connection = New OleDb.OleDbConnection(connstring)


            loginCommand.Connection.Open()
            loginCommand.ExecuteNonQuery()
            Dim da As New OleDb.OleDbDataAdapter(loginCommand)

            Dim ds As New DataSet


            da.Fill(ds, "tblusers")

            MessageBox.Show("Welcome Teacher")
            frmTeacherForm.Show()
            Me.Hide()

        Else
            MessageBox.Show("Login Failed!!")
            txtUsername.Clear()
            txtPass.Clear()
            txtUsername.Focus()

        End If

 End Sub



Моя база данных MS ACCESS:

tblUsers

User_id | первичный ключ
User_fname | короткий текст
User_lname | короткий текст
User_username / короткий текст
User_password | короткий текст
User_usertype | короткий текст

Что я уже пробовал:

Содержание этого блока было точно таким же, как и описание проблемы. См. раздел "описание проблемы" (комментарий Брайана Тана).

[no name]

Вы, вероятно, захотите на самом деле проверить результат вашего запроса....

F-ES Sitecore

Там нет кода, где вам нужен пароль, просто пройдите через код в отладчике. Вы просто создаете оператор SELECT, выполняете его, но игнорируете результаты, и это все, что вы делаете. Какая часть вашего кода заставляет вас думать, что он прервет вход в систему?

Bryian Tan

Я согласился с вашим наблюдением :). Сначала я думал, что удалил его, изменив вопрос.

Richard Deeming

Кроме того, вы храните пароли в виде обычного текста. Не делай этого.

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хеширование паролей - все правильно[^]

Jim Clinton

Dim accessReader как OleDbDataReader
accessReader = loginCommand.Метода executereader
Если accessReader.Читать Далее
Если accessReader

--------------------------------------------------------------------------------------
invalidoperationexecption был обработан

Необработанное исключение типа ' System.InvalidOperationException ' произошло в System.Data.dll

Дополнительная информация: ExecuteReader требует открытого и доступного соединения. Текущее состояние соединения закрыто.

1 Ответов

Рейтинг:
1

Peter Leow

Код для обработки возврата из sql-запроса не существует,он никогда не будет проверяться. Более того, ваш sql-запрос очень привлекателен SQL-инъекция[^], вместо этого вы должны использовать параметризованный запрос, см. следующий фрагмент:

Dim sqlLoginCode As String = "select * from tblusers where User_username = @username AND User_password = @userpassword AND User_usertype = @usertype"

Dim loginCommand As New OleDb.OleDbCommand(sqlLoginCode)
loginCommand.Connection = New OleDb.OleDbConnection(connstring)

loginCommand.CommandType = CommandType.Text

loginCommand.Parameters.AddWithValue("@username", txtUsername.Text)
loginCommand.Parameters.AddWithValue("@userpassword", txtPass.Text)
loginCommand.Parameters.AddWithValue("@usertype", cmbLoginType.Text)

Dim accessReader As OleDbDataReader
accessReader = loginCommand.ExecuteReader
If accessReader.Read Then
    If accessReader("User_usertype") = "Administrator"  Then
        Console.WriteLine("User is Administrator.")
    Else
        Console.WriteLine("User is Teacher.")
    End If
Else
    Console.WriteLine("Invalid user or password")
End If
Это быстрый черновик из блокнота для демонстрационной цели, адаптируйте его к вашим потребностям. И последнее: почему вы хотите, чтобы пользователь указал свою роль администратора или учителя, поскольку вы можете получить ее из базы данных?


Jim Clinton

Dim accessReader как OleDbDataReader
accessReader = loginCommand.Метода executereader
Если accessReader.Читать Далее
Если accessReader

--------------------------------------------------------------------------------------
У меня есть ошибка сказал он
invalidoperationexecption был обработан

Необработанное исключение типа ' System.InvalidOperationException ' произошло в System.Data.dll

Дополнительная информация: ExecuteReader требует открытого и доступного соединения. Текущее состояние соединения закрыто.

Peter Leow

Я не дал вам полный код, вы должны выяснить остальное.
Узнайте, как прочитать сообщение об ошибке: дополнительная информация: ExecuteReader требует открытого и доступного соединения. Текущее состояние соединения закрыто.