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

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

我想为每个表单创建基于角色的权限。我可以应用多简单的方法?请指导我。

如果以所有者身份登录,则他可以访问所有表单,而如果以管理员身份登录,则无法使用更新按钮的主表单,并且有一个用户无权访问的消息框,管理员也可以显示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

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

有点觉得这应该是评论而不是答案,但这确实是一个很大的话题,所以可能不适合放在那里。这实际上更多的是软件设计和逻辑问题,而不是任何具体的故障排除编码/工具问题,因此甚至可能超出本论坛的范围。因此,我只是保留所有概念性内容,而不会过多讨论具体的实现细节。解决这个问题也有很多不同的方法,所以虽然这对我来说很有意义,但其他人会有不同的看法。

虽然可能有许多第三方库和工具可以帮助解决这个问题,但我真的不知道如何或是否可以回顾性地实施它们。您可以根据自己的目的找到并提升这些内容。

您在这里讨论的安全类型实际上最好在开发之初就实施。我猜您只是直接开始编写应用程序,而没有考虑安全性等问题。

理想情况下,您最好做的是创建一个基本表单,它通过 Form.Load() 事件(或者可能在表单事件周期中的其他地方)实现您的安全逻辑。 可能是从 Load 事件调用的一些“可重写”方法。使用可重写方法模式意味着您可以在各个表单上自定义逻辑。

然后,当向应用程序添加新表单时,您将继承这个基类。在重写继承表单上的 Form.Load 时需要注意的一件事是,您需要调用基本加载事件。

考虑到这一点,考虑到您的应用程序中已经有许多表单,如果您想执行这种类型的模式,有两种选择。

  1. 您可以创建实现所需安全逻辑的基本表单,然后修改现有表单(designer.vb 文件)以继承新的基本表单。

  2. 在每个表单中实现安全逻辑。

如果是我的话,我会选择选项 1,Base for 使您能够标准化外观和感觉并实现通用控件等。

© www.soinside.com 2019 - 2024. All rights reserved.