Adicionando funções personalizadas - VB 2008 Winforms
-
21-09-2019 - |
Pergunta
Eu tenho um aplicativo WinForms (VB 2008) que estou desenvolvendo e quero usar funções personalizadas para acesso ao usuário.
Layout do aplicativo:Eu tenho um formulário principal que abre um formulário de login quando determinadas ações ocorrem. O estagiário de formulário de login usa uma classe de autenticação que eu criei, para autenticar usuários e definir direitos de acesso. Na página Configurações de aplicativos, tenho o modo de autenticação definido como definido pelo aplicativo porque não posso usar a autenticação do Windows no ambiente em que isso será implantado.
O aplicativo usa um MS SQL 2005 DB e as 3 tabelas que estou usando no processo de autenticação são as tabelas User_Account, User_Roles e User_Access. A combinação de uma conta na tabela User_Account e as funções na tabela User_Roles são as bases da tabela User_Access. Usando a tabela user_access é como atribuo acesso às várias funções do aplicativo
Método de autenticação: Para autenticar um usuário, estou usando o método "my.user.currentPrincipal" (código abaixo). O objeto My.User funciona muito bem e permite o uso da propriedade "my.user.name" em todo o aplicativo ao se referir ao usuário atualmente autenticado.
Método de acesso:Para definir os níveis atuais de acesso aos usuários, estou usando uma função na minha classe de autenticação e passando no meu.user.name como uma variável. A função usa um adaptador de tabela de dados e uma instrução de caso de seleção dentro de um loop para atribuir todos os níveis de acesso ao usuário (código da função abaixo).
Meu problema:Esse método de atribuir direitos de acesso a um usuário funciona, mas não é persistente em todo o aplicativo como o objeto My.User é. Gostaria de encontrar uma maneira de criar funções personalizadas através do objeto My.User usando sua propriedade .isinRole. Eu gostaria de criar essas funções dinamicamente usando minha tabela user_roles. Isso permitiria que as funções personalizadas fossem usadas em todo o meu aplicativo usando a sintaxe My.User.isInRole ("MyRole") ... semelhante à maneira como sou capaz de usar o meu.user.name. Infelizmente, as únicas funções contra as quais posso validar atualmente são as contas do tipo Windows (Adminisrator ... etc.).
Encontrei muitas informações e exemplos relacionados ao ASP.NET, além de configurar a autenticação WinForms Windows, mas nada tão longe relacionado ao meu problema. Eu acho que há uma maneira de conseguir isso ... mas não consegui encontrá -lo. Qualquer ajuda seria muito apreciada!!
Obrigado pela ajuda!
'Exemplo de autenticação do usuário:
If Authenticate.CheckPassword(tbxUserName.Text, strPassword) Then
My.User.CurrentPrincipal = New GenericPrincipal(New GenericIdentity(tbxUserName.Text), Nothing)
'Exemplo de atribuição de acesso:
Public Shared Function GetUser(ByVal strUsername As String) As Authenticate
Using UserAdapter As New dbUserTableAdapters.User_AccountsTableAdapter()
Dim UserTable As dbUser.User_AccountsDataTable = UserAdapter.GetByUser(strUsername)
Dim tempUser As New Authenticate() _
With {.ID = UserTable(0).id, _
.Username = UserTable(0).User_Name, _
.Password = UserTable(0).id}
Using AccessAdapter As New dbUserTableAdapters.User_AccessTableAdapter()
Dim AccessTable As dbUser.User_AccessDataTable = AccessAdapter.GetByUser(tempUser.ID)
For c As Integer = 0 To AccessTable.Rows.Count - 1
Select Case AccessTable(c).Role_Id
Case RoleType.SysAdmin
tempUser.AllowSysAdmin = True
Case RoleType.Maintenance
tempUser.AllowMaintenance = True
Case RoleType.ReportAll
tempUser.AllowRptAll = True
Case RoleType.ReportException
tempUser.AllowRptExceptions = True
Case RoleType.EventManagment
tempUser.AllowEventStart = True
Case Else
End Select
Next
Return tempUser
End Using
End Using
End Function
Solução
Eu acho que você precisa implementar um objeto iPrincipal personalizado que acessa sua tabela SQL. Tentar isto página.
Editar:
Primeiro, dê uma olhada nas definições de Ientidade e IPrincipal. Você notará que a Ientidade não tem uma propriedade de 'função' definida. Eles optaram por implementar uma propriedade adicional chamada função na implementação da Ientidade (SampleIentity) e, em seguida, a usou a partir da implementação do iPrincipal. O que estou sugerindo é que você implemente sua própria propriedade (que consulta sua tabela existente) e retorna uma (ou uma matriz) de um tipo de função que você se define. Então, na sua implementação do iPrincipal, você pode codificar o isinRole para consultar a nova propriedade de função. Espero que isso faça mais sentido que minha resposta bastante acanhada.