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