2009-09-02 2 views
1

У меня есть приложение winforms (VB 2008), которое я разрабатываю, и я хочу использовать пользовательские роли для доступа пользователей.Добавление пользовательских ролей - VB 2008 Winforms

Application Layout: У меня есть основная форма, которая открывает форму входа в систему, когда происходят определенные действия. Стажер формы входа в систему использует класс проверки подлинности, который я создал, для аутентификации пользователей и установки прав доступа. На моей странице настроек приложений у меня есть режим проверки подлинности, установленный на Application-defined, потому что я не могу использовать проверку подлинности Windows в среде, где это будет развернуто.

Приложение использует MS SQL 2005 db, а три таблицы, которые я использую в процессе аутентификации, - это таблицы 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 (администратор ... ect.).

Я нашел много информации и примеров, связанных с ASP.Net, а также установил подлинность Windows Forms 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 

ответ

0

Я думаю, что вам нужно реализовать собственный объект IPrincipal, который получает доступ к вашей SQL таблицы , Попробуйте this.

Edit:

Во-первых, посмотрите на определения IIdentity и IPrincipal. Вы заметите, что у IIdentity не определено свойство Role. Они решили реализовать дополнительное свойство «Роль» при их внедрении IIdentity (SampleIIdentity), а затем они использовали его из своей реализации IPrincipal. Я предлагаю, что вы реализуете свое собственное свойство Role (которое запрашивает вашу существующую таблицу) и возвращает один (или массив) типа Role, который вы сами определяете. Затем в вашей реализации IPrincipal вы можете запрограммировать IsInRole для запроса нового свойства Role. Надеюсь, это имеет смысл, что мой довольно скудный ответ.

+0

Возможно, это только я (очень возможно), но когда я просматриваю пример Microsoft, на который ссылается ваша ссылка, я могу получить доступ только к встроенным системным ролям (администратор, гость ... и т. Д.). Я могу настроить пользовательский пользователь и получить доступ к нему через свойство My.User.Name, но я не могу понять, как создавать и назначать пользовательские роли пользователю (кроме ролей на базе Windows) и использовать их с помощью My. Свойство User.IsInRole («MyCustomRole»). У вас бы не было предложений, которые могли бы привести меня к тому, что мне нужно. Спасибо! –

+0

У меня нет доступа ко всему отсюда, и я работаю из памяти (что не так, как раньше), но я обновил свой ответ, основываясь на том, что я помню. – ssg31415926

+0

Большое спасибо за обновленный ответ. Проект, над которым я работаю, является первым, с которым мне когда-либо приходилось использовать этот тип аутентификации, поэтому он занимает некоторое время для всех погружений (я могу быть немного толстым голосом). Позвольте мне немного поиграть в новую информацию, и я должен учесть ее с дополнительной информацией, которую вы предоставили. Еще раз спасибо! Я очень ценю, что вы нашли время, чтобы помочь. –

Смежные вопросы