Добавление пользовательских ролей - VB 2008 Winforms
-
21-09-2019 - |
Вопрос
У меня есть приложение на основе Winforms (VB 2008), которое я разрабатываю, и я хочу использовать настраиваемые роли для доступа пользователей.
Макет приложения:У меня есть основная форма, которая открывает форму входа в систему при выполнении определенных действий.Стажер формы входа использует созданный мной класс аутентификации для аутентификации пользователей и установки прав доступа.На странице настроек приложений для режима аутентификации установлено значение «Определяется приложением», поскольку я не могу использовать проверку подлинности Windows в среде, где она будет развернута.
Приложение использует базу данных MS SQL 2005, и в процессе аутентификации я использую три таблицы: User_Account, User_Roles и User_Access.Комбинация учетной записи в User_Account и ролей в таблице User_Roles является основой таблицы User_Access.Используя таблицу User_Access, я назначаю доступ к различным функциям приложения.
Метод аутентификации: Для аутентификации пользователя я использую метод My.User.CurrentPrincipal (код ниже).Объект My.User отлично работает и позволяет использовать свойство My.User.Name во всем приложении при обращении к текущему аутентифицированному пользователю.
Метод доступа:Чтобы установить текущие уровни доступа пользователей, я использую функцию в своем классе аутентификации и передаю My.User.Name в качестве переменной.Функция использует адаптер таблицы набора данных и оператор Select Case внутри цикла For, чтобы назначить все уровни доступа для пользователя (код функции ниже).
Моя проблема:Этот метод назначения прав доступа пользователю работает, но он не является постоянным во всем приложении, как объект My.User.Я хотел бы найти способ создания пользовательских ролей с помощью объекта My.User, используя его свойство .IsInRole.Я хотел бы, чтобы эти роли создавались динамически с использованием моей таблицы User_Roles.Это позволит использовать пользовательские роли во всем моем приложении с использованием синтаксиса My.User.IsInRole("MyRole")... аналогично тому, как я сейчас могу использовать My.User.Name.К сожалению, единственные роли, которые я могу в настоящее время проверять, — это встроенные учетные записи типа Windows (Администратор... и т. д.).
Я нашел много информации и примеров, связанных с ASP.Net, а также с настройкой аутентификации Winforms Windows, но пока ничего непосредственно не связанного с моей проблемой.Я думаю, что есть способ добиться этого... но я не смог его найти.Любая помощь будет принята с благодарностью!!
Спасибо за помощь!
'Пример аутентификации пользователя:
If Authenticate.CheckPassword(tbxUserName.Text, strPassword) Then
My.User.CurrentPrincipal = New GenericPrincipal(New GenericIdentity(tbxUserName.Text), Nothing)
'Пример назначения доступа:
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
Решение
Я думаю, вам нужно реализовать собственный объект IPrincipal, который обращается к вашей таблице SQL.Пытаться этот страница.
Редактировать:
Прежде всего, ознакомьтесь с определениями IIидентичность и IP-принципал.Вы заметите, что у IIdentity не определено свойство «Роль».Они решили реализовать дополнительное свойство под названием Role в своей реализации IIdentity (SampleIIdentity), а затем использовали его из своей реализации IPrincipal.Я предлагаю вам реализовать собственное свойство Role (которое запрашивает существующую таблицу) и возвращать один (или массив) типа роли, который вы определяете сами.Затем в вашей реализации IPrincipal вы можете написать IsInRole для запроса нового свойства Role.Надеюсь, это имеет больше смысла, чем мой довольно скудный ответ.