إضافة أدوار مخصصة - VB 2008 winforms
-
21-09-2019 - |
سؤال
لديّ تطبيق WinForms (VB 2008) الذي أقوم بتطويره وأريد استخدام أدوار مخصصة للوصول إلى المستخدم.
تخطيط التطبيق:لدي نموذج رئيسي يفتح نموذج تسجيل الدخول عند حدوث إجراءات معينة. يستخدم متدرب نموذج تسجيل الدخول فئة مصادقة قمت بإنشائها ، لمصادقة المستخدمين وضبط حقوق الوصول. في صفحة إعدادات التطبيقات الخاصة بي ، لدي وضع مصادقة محدد على التطبيق لأنه لا يمكنني استخدام مصادقة 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 كمتغير. تستخدم الوظيفة محول جدول مجموعة البيانات وبيان حالة تحديد داخل A for Loop لتعيين جميع مستويات الوصول للمستخدم (رمز الوظيفة أدناه).
مشكلتي:تعمل هذه الطريقة لتعيين حقوق الوصول للمستخدم ولكنها غير ثابتة في جميع أنحاء التطبيق لأن كائن My.user هو. أرغب في إيجاد طريقة لإنشاء أدوار مخصصة من خلال كائن my.user باستخدام خاصية .isinrole. أرغب في إنشاء هذه الأدوار ديناميكيًا باستخدام جدول user_roles الخاص بي. هذا من شأنه أن يسمح باستخدام الأدوار المخصصة خلال طلبي باستخدام بناء جملة my.user.isinrole ("myrole") ... على غرار كيف يمكنني حاليًا استخدام my.user.name. لسوء الحظ ، فإن الأدوار الوحيدة التي يمكنني التحقق منها حاليًا هي حسابات نوع Windows المضمنة (adminiSrator ... ect.).
لقد وجدت الكثير من المعلومات والأمثلة المتعلقة بـ 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 الخاص بك. محاولة هذه صفحة.
تعديل:
أولاً ، إلقاء نظرة على تعريفات iidentity و iprincipal. ستلاحظ أن iidentity ليس له خاصية "دور" محددة. لقد اختاروا تنفيذ خاصية إضافية تسمى دورها في تنفيذها لـ IIdentity (SampleIidentity) ثم استخدموها من تنفيذها لـ IPrincipal. ما أقترحه هو أن تقوم بتنفيذ خاصية الدور الخاصة بك (التي تستفسر عن جدولك الحالي) وإرجاع واحد (أو صفيف) من نوع الدور الذي تحدده بنفسك. ثم في تنفيذ iPrincipal ، يمكنك رمز Isinrole للاستعلام عن خاصية الدور الجديد. نأمل أن يكون هذا أكثر منطقية أن إجابتي الخفية.