如何在vb.net中不创建每个表单的情况下设置用户访问权限

问题描述 投票:0回答:1

如何在vb.net中设置各个表单的用户访问权限?

下面我为每个表单创建了程序代码

USERACCESS

有没有一种方法无需创建每个表单,以便我可以将其安排在一个模块或类中,或者如果我的代码有问题,请指导我

谢谢

模块程序中的代码

Friend Module Program
    Public Userinformation As DTOUsers 'stores current rolename when they login.
    ''' <summary>
    ''' The main entry point for the application.
    ''' </summary>
    <STAThread>
    Public Sub Main()
        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(False)
        Application.Run(New frmLoginRegister())
    End Sub
End Module

登录表单中的代码

Public Class frmLoginRegister
    Private uService As New UserService()
    Private Sub BtnLogin_Click(sender As Object, e As EventArgs) Handles BtnLogin.Click
        'add dapper logics here 
        Dim users = uService.GetDTOUsersByUsername(txtUsername.Text)
        If users.Username = txtUsername.Text AndAlso users.Password = txtPassword.Text Then
            Program.Userinformation = users
            MessageBox.Show("Successfull, Welcome " & users.RoleName)
            Me.ShowInTaskbar = False
            Me.Hide()
            Call (New FrmMain()).ShowDialog()
            Environment.Exit(0)
        Else
            MessageBox.Show("Invalid Login details")
        End If
    End Sub
End Class

模块用户信息中的代码

Public Module UserInformation
    Public UserName As String
    Public Password As String
    Public RoleId As Integer
    Public RoleName As String
End Module

主窗体中的代码

Public Class FrmMain
    Private Sub Button2BtnShowform2_Click(sender As Object, e As EventArgs) Handles BtnShowform2.Click
        Dim frm As New Form2()
        frm.ShowDialog()
    End Sub
    Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ToolUsername.Text = Program.Userinformation.RoleName
    End Sub
    Private Sub BtnShowform3_Click(sender As Object, e As EventArgs) Handles BtnShowform3.Click
        Dim frm As New Form3()
        frm.ShowDialog()
    End Sub
End Class

表格2中的代码

Public Class Form2
    Private Sub USERACCESS()
        Dim username = Program.Userinformation.RoleName
        If username = "Admin" Then
            DataGridView1.Columns("colDel").Visible = False
        End If
    End Sub

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        USERACCESS()
    End Sub
End Class

FORM3 中的代码

Public Class Form3
    Private Sub USERACCESS()
        Dim username = Program.Userinformation.RoleName
        If username = "Admin" Then
            DataGridView1.Columns("colDel").Visible = False
        End If
    End Sub
    Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        USERACCESS()
    End Sub
End Class

更新代码信息类模型

Public Class DTOUsers
    Public Property RoleID() As Integer
    Public Property Username() As String
    Public Property Password() As String
    Public Property RoleName() As String
End Class

更新代码信息方法服务

Public Class UserService
    Public Function GetDTOUsersByUsername(ByVal Username As String) As DTOUsers
        Dim sql = $"SELECT * FROM Users INNER JOIN Role ON Users.Roleid = Role.Roleid where Username ='{Username}'"
        Using _conn = New OleDbConnection(GetOledbConnectionString())
            Return _conn.Query(Of DTOUsers)(sql).FirstOrDefault()
        End Using
    End Function
End Class

表格主

vb.net winforms dapper
1个回答
0
投票

这里有很多错误,所以评论是不够的。

用户认证

您正在从数据存储(数据库?)中检索用户密码,然后将其与

txtPassword
中的值进行比较。由于以下几个原因,这并不安全:

  1. 您正在以纯文本形式存储密码。
  2. 您将密码从数据库以纯文本形式传送到应用程序。
  3. 您将纯文本密码存储在我认为是 DTOusers 的位置(为什么是复数?这是一个用户。)

相反,您应该以最小的方式对密码进行哈希处理,并将哈希后的密码存储在数据存储中。然后,您将用户 ID 和在

txtPassword
中输入的密码的哈希值传递到数据库并确定它们是否匹配,以进行 身份验证

您发布的代码

您已发布此代码:

Friend Module Program
    Public Userinformation As DTOUsers 'stores current rolename when they login.
    ' Snipped
End Module

您没有发布

DTOUsers
的代码定义。相反,您有一个包含四个独立的、不相关的全局变量的模块,这似乎是您在 DTOUsers 中想要的:

Public Module UserInformation
    Public UserName As String
    Public Password As String
    Public RoleId As Integer
    Public RoleName As String
End Module

你有

DTOUsers
的定义吗?你有
Option Strict On
吗?您需要为
Class
定义一个
DTOUsers
没有密码:

Public Class UserDTO
    Public UserName As String
    Public RoleId As Integer
    Public RoleName As String
End Module

注意:只有当用户在应用程序中仅限于一个角色时,这才有效。

您还有未发布的代码。例如,这一行...

Dim users = uService.GetDTOUsersByUsername(txtUsername.Text)

...调用

uService.GetDTOUsersByUsername
,但我们不知道返回类型。您还声明了没有类型的
users
,因此我们甚至无法推断返回类型。

用户授权

假设所有用户代码都已修复并正常工作,UserDTO 中填充了角色 ID 和角色名称,那么您需要做几件事。

  1. 禁用或隐藏打开用户无权访问的表单的表单控件。
  2. 此外,如果当前用户有权访问该表单,请检查每个表单构造函数。如果没有,请抛出权限异常,因为这会告诉您错过了在某处隐藏/禁用控件。
  3. 此外,在任何数据库调用时进行权限检查。您可能错过了禁用/隐藏打开表单的控件,并且您可能错过了在该表单的构造函数中检查权限,因此第三道防线是检查数据库调用。
© www.soinside.com 2019 - 2024. All rights reserved.