winforms 如何在VB.NET中使用Access数据库为Dapper中的每个表单创建基于用户角色的权限

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

我想为每个表单创建基于角色的权限。如何简单的方法可以应用?请指引我。
如果以所有者身份登录,则他可以访问所有表单,而如果以管理员身份登录,则无法使用更新按钮的主表单,并且存在用户没有访问权限的消息框,并且管理员可以显示表单2,但无法使用按钮1,并且存在用户没有访问权限的消息框。
这只是一个示例,因为原始项目有许多形式。
谢谢
表单1中的代码(登录)

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

表:用户
| 用户名|密码|RoleID|
| --|--|--|
| TEST1|测试@123| 1 |
| TEST2|测试@1234| 2 |
表:角色
| Roleid| roleName|
| --|--|
| 1 |所有者|
| 2 |Admin|
表格1(登录)

FrmMain

Form2

zfycwa2u

zfycwa2u1#

有点觉得这应该是一个评论,而不是一个答案,但这真的是一个大主题,所以可能不适合那里。这实际上是一个软件设计和逻辑问题,而不是任何具体的故障排除编码/工具,所以可能甚至超出了这个论坛的范围。因此,我将保持这一切的概念性,而不深入到确切的实现细节。也有许多不同的方法来解决这个问题,所以虽然这对我来说是有意义的,但其他人会有不同的意见。
虽然可能有许多第三方库和工具,将有助于这一点,我真的不知道如何或如果他们可以实现回顾。这取决于你找到并提升这些为您的目的。
您在这里谈论的安全性类型最好在开发开始时实现。我猜你只是直接投入到应用程序的编码中,而没有考虑安全性等问题。
理想情况下,您最好做的是创建一个Base Form,它通过Form.Load()事件(或者表单事件循环中的其他地方)实现您的安全逻辑。可能是一些从Load事件调用的“可重写”方法。使用可重写方法模式意味着您可以在单个表单上自定义逻辑。
然后,当向应用程序添加新窗体时,您将继承此基类。在重写继承窗体上的Form.Load时需要注意的一件事是,您将需要调用基本加载事件。
考虑到这一点,考虑到您的应用程序中已经有了许多表单,如果您想使用这种类型的模式,有两种选择。
1.您可以创建实现所需安全逻辑的基窗体,然后修改现有窗体(designer.vb文件)以继承新的基窗体。
1.在每个表单中实现安全逻辑。
如果是我的话,我会选择选项1,Base for让你能够扩展外观和感觉,并实现通用控件等。

相关问题