سؤال

لديّ تطبيق 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 للاستعلام عن خاصية الدور الجديد. نأمل أن يكون هذا أكثر منطقية أن إجابتي الخفية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top