已关闭,此问题需要更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
单主
1条答案
按热度按时间sgtfey8w1#
这里有很多错误,所以评论是不够的。
用户鉴权
您正在从数据存储(数据库?),然后将其与
txtPassword
中的值进行比较。这是不安全的,原因有几个:1.您将以纯文本形式存储密码。
1.您将密码以纯文本的形式从数据库带到应用程序中。
1.您将纯文本密码存储在我认为是DTO用户的位置(为什么是复数?一个用户)。
相反,您应该至少对密码进行哈希运算,并将哈希运算后的密码存储在数据存储中。然后,将用户ID和在
txtPassword
中输入的密码的哈希值传递到数据库,并确定它们是否匹配,以进行身份验证。您发布的代码
你发布了这个代码:
你没有发布
DTOUsers
的代码定义。相反,你有一个模块,它有四个独立的、不相关的全局变量,这似乎是你在DTOUsers中想要的:你有
DTOUsers
的定义吗?你有Option Strict On
吗?您需要为DTOUsers
定义一个Class
,* 不带 * 密码:注意:只有当用户在应用程序中被限制为一个角色时,这才有效。
你也有没有发布的代码。例如,这条线…
.调用
uService.GetDTOUsersByUsername
,但我们不知道返回类型。你也声明了没有类型的users
,所以我们甚至不能推断返回类型。用户授权
假设所有的用户代码都已修复,并且可以干净地工作,UserDTO中填充了角色ID和角色名称,那么您需要做几件事。
1.禁用或隐藏打开用户无权访问的窗体的窗体控件。
1.另外,如果当前用户有权访问每个Form构造函数,请检查该构造函数。如果没有,抛出一个异常,因为这将告诉你你错过了隐藏/禁用某个控件的地方。
1.此外,在任何数据库调用时都要进行权限检查。您可能错过了禁用/隐藏打开窗体的控件,并且可能错过了检查该窗体的构造函数中的权限,因此第三道防线是检查数据库调用。
授权说明
下一步是确保用户被授权访问资源,比如表单。对于任何不对所有经过身份验证的用户可用的表单,都应该检查用户的角色以获得适当的授权。例如,假设您有一个全局应用程序范围的变量,您在登录时加载了数据:
您需要根据需要检查每个表单上
currentUser
的授权:在Form的构造函数中检查授权。失败得快,失败得狠。如果用户看到这个异常消息,这意味着你没有保护另一个窗体的控件,打开这个窗体(一个菜单项,一个按钮,无论什么)。