我想为每个表单创建基于角色的权限。我可以应用多简单的方法?请指导我。
如果以所有者身份登录,则他可以访问所有表单,而如果以管理员身份登录,则无法使用更新按钮的主表单,并且有一个用户无权访问的消息框,管理员也可以显示form2但button1无法使用,并且有一个用户无权访问的消息框。
这只是一个示例,因为原始项目有很多形式。
谢谢
Form1 中的代码(登录)
Public Class Form1
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.Password = txtPassword.Text AndAlso users.Username = txtUsername.Text Then
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 Class UserService
Public Function GetOledbConnectionString() As String
Return "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\dapperdemo.accdb;Persist Security Info=False;"
End Function
Private ReadOnly _conn As OleDbConnection
Private _connectionString As String = GetOledbConnectionString()
Public Sub New()
_conn = New OleDbConnection(_connectionString)
End Sub
Public Function GetUserByUsername(ByVal Username As String) As Users
Dim sql = $"SELECT * FROM Users WHERE Username = '{Username}'"
Using _conn = New OleDbConnection(GetOledbConnectionString())
Return _conn.Query(Of Users)(sql).FirstOrDefault()
End Using
End Function
Public Function GetUserByRolename(ByVal Rolename As String) As Role
Dim sql = $"SELECT RoleName FROM Users WHERE Username = '{Rolename}'"
Using _conn = New OleDbConnection(GetOledbConnectionString())
Return _conn.Query(Of Role)(sql).FirstOrDefault()
End Using
End Function
Public Function GetDTOUsersByUsername(ByVal Username As String) As DTOUsers
Dim sql = $"SELECT * FROM Users INNER JOIN Role ON Users.Roleid = Role.Roleid"
Using _conn = New OleDbConnection(GetOledbConnectionString())
Return _conn.Query(Of DTOUsers)(sql).FirstOrDefault()
End Using
End Function
End Class
Public Class Users
Public Property Username() As String
Public Property Password() As String
Public Property RoleID() As Integer
End Class
Public Class Role
Public Property RoleID() As Integer
Public Property RoleName() As String
End Class
Public Class DTOUsers
Public Property Username() As String
Public Property Password() As String
Public Property RoleName() As String
End Class
FormMain 中的代码
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
End Class
表:用户
用户名 | 密码 | 角色ID |
---|---|---|
测试1 | 测试@123 | 1 |
测试2 | 测试@1234 | 2 |
表:角色
劳莱德 | 角色名称 |
---|---|
1 | 业主 |
2 | 管理员 |
表格1(登录)
FrmMain
表格2
有点觉得这应该是评论而不是答案,但这确实是一个很大的话题,所以可能不适合放在那里。这实际上更多的是软件设计和逻辑问题,而不是任何具体的故障排除编码/工具问题,因此甚至可能超出本论坛的范围。因此,我只是保留所有概念性内容,而不会过多讨论具体的实现细节。解决这个问题也有很多不同的方法,所以虽然这对我来说很有意义,但其他人会有不同的看法。
虽然可能有许多第三方库和工具可以帮助解决这个问题,但我真的不知道如何或是否可以回顾性地实施它们。您可以根据自己的目的找到并提升这些内容。
您在这里讨论的安全类型实际上最好在开发之初就实施。我猜您只是直接开始编写应用程序,而没有考虑安全性等问题。
理想情况下,您最好做的是创建一个基本表单,它通过 Form.Load() 事件(或者可能在表单事件周期中的其他地方)实现您的安全逻辑。 可能是从 Load 事件调用的一些“可重写”方法。使用可重写方法模式意味着您可以在各个表单上自定义逻辑。然后,当向应用程序添加新表单时,您将继承这个基类。在重写继承表单上的 Form.Load 时需要注意的一件事是,您需要调用基本加载事件。
考虑到这一点,考虑到您的应用程序中已经有许多表单,如果您想执行这种类型的模式,有两种选择。