winforms 如何设置用户访问权限,而无需在vb.net中的每个表单中创建 [已关闭]

i5desfxk  于 2023-10-23  发布在  .NET
关注(0)|答案(1)|浏览(119)

已关闭,此问题需要更focused。它目前不接受回答。
**想改善这个问题吗?**更新问题,使其只关注editing this post的一个问题。

10天前关闭。
Improve this question
如何在vb.net?中的每个表单中设置用户访问权限
下面我为每个表单USERACCESS创建了过程代码
有没有一种方法不创建每一个形式,使我可以安排在一个模块或类或如果有一些错误,在我的代码,请指导我
谢谢
CODE IN模块程序

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)
        Dim verified As Boolean = BCrypt.Net.BCrypt.Verify(txtPassword.Text, users.Password)
        If users.Username = txtUsername.Text AndAlso verified 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

CODE IN模块用户信息

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

表格3中的代码

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

单主

sgtfey8w

sgtfey8w1#

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

用户鉴权

您正在从数据存储(数据库?),然后将其与txtPassword中的值进行比较。这是不安全的,原因有几个:
1.您将以纯文本形式存储密码。
1.您将密码以纯文本的形式从数据库带到应用程序中。
1.您将纯文本密码存储在我认为是DTO用户的位置(为什么是复数?一个用户)。
相反,您应该至少对密码进行哈希运算,并将哈希运算后的密码存储在数据存储中。然后,将用户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吗?您需要为DTOUsers定义一个Class,* 不带 * 密码:

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.禁用或隐藏打开用户无权访问的窗体的窗体控件。
1.另外,如果当前用户有权访问每个Form构造函数,请检查该构造函数。如果没有,抛出一个异常,因为这将告诉你你错过了隐藏/禁用某个控件的地方。
1.此外,在任何数据库调用时都要进行权限检查。您可能错过了禁用/隐藏打开窗体的控件,并且可能错过了检查该窗体的构造函数中的权限,因此第三道防线是检查数据库调用。

授权说明

下一步是确保用户被授权访问资源,比如表单。对于任何不对所有经过身份验证的用户可用的表单,都应该检查用户的角色以获得适当的授权。例如,假设您有一个全局应用程序范围的变量,您在登录时加载了数据:

' This DTO is loaded with data at application log in.
Public currentUser as UserDTO

您需要根据需要检查每个表单上currentUser的授权:

Public Class Form2
    
    Public Sub New()

        If currentUser.RoleName <> "Admin" Then
           Throw New Exception("You do not have access to Form2.")
        End If

    End Sub

End Class

在Form的构造函数中检查授权。失败得快,失败得狠。如果用户看到这个异常消息,这意味着你没有保护另一个窗体的控件,打开这个窗体(一个菜单项,一个按钮,无论什么)。

相关问题