كيف يمكنني الوصول إلى أدوار JAAS عند نقطة عشوائية في الكود؟

StackOverflow https://stackoverflow.com/questions/528938

سؤال

أرغب في الوصول إلى النموذج الكامل للمستخدمين بأدوارهم في تطبيق SOAP الخاص بي.على سبيل المثال، قد أرغب في معرفة دور مستخدم يُدعى "فريد".

كيف يمكنني الوصول إلى نوع ما من تسجيل JAAS العالمي والقيام به (الكود الكاذب) globalRegistry.getUser("فريد").getPrincipals()؟(لاحظ أنه في JAAS، يتم تمثيل الدور بواسطة a رئيسي.)

أنا أعرف كيفية الحصول على رئيسي التابع موضوع من سياق تسجيل الدخول, ، ولكن هذا له مشكلتين.

  1. يتم ذلك فقط في لحظة تسجيل الدخول، وأنا أفضل عدم ترميز السجل المذكور أعلاه وتخزين ملف موضوع و رئيسي الكائنات بنفسي، حيث تم تخزينها بالفعل بواسطة خادم التطبيقات.
  2. ويفضل أن أكون قادرًا على الوصول إلى هذه المعلومات حتى عندما لا يكون فريد هو المستخدم الحالي.

أنا أستخدم Jetty، ولكني أفترض أن هذه السلوكيات قياسية في JAAS.

هل كانت مفيدة؟

المحلول

نحن نستخدم متغير ThreadLocal للإشارة إلى المستخدم الحالي كما تمت مصادقته عند نقطة دخول النظام (servlet أو ejb في حالتنا).وهذا يسمح بالوصول "العالمي" إلى المستخدم الحالي.ولا يرتبط هذا بشكل مباشر بـ JAAS أو أي بروتوكول أمان آخر، ولكن يمكن تهيئته منها.

يحرر:العائد من ThreadLocal هو الموضوع للمستخدم الحالي.

عادةً ما يتم الوصول إلى المستخدمين الآخرين عبر نوع ما من وحدات الإدارة.

نصائح أخرى

النمط الذي رأيته هو:

AccessControlContext acc = AccessController.getContext();
Subject subject = Subject.getSubject(acc);
Set<Principal> principals = subject.getPrincipals();

بشكل أساسي، يقوم هذا بالبحث عن الموضوع المرتبط حاليًا بالسلسلة الحالية، ويسأل عن مبادئه.

أحد الأمثلة على استخدام هذا هو في أباتشي جاكرابتRepositoryImpl.انها في extendAuthentication الطريقة، التي تتمثل مهمتها في تحديد حقوق Jackrabbit التي يمتلكها الخيط الحالي عند إنشاء جلسة جديدة (على ما أظن).

ومع ذلك، يجب أن أشير إلى أن هذا قد لا ينجح بالضرورة، على الأقل في سياقات J2EE.أنا أستخدم هذا الرمز ضمن JBoss AS7، ولا يجد موضوعًا.قد يكون هذا مجرد خطأ، رغم ذلك.

بالنسبة لي، يبدو أن هذا يزعج مستخدمي التطبيقات والمجموعات وما إلى ذلك.مع أدوار تطبيق J2EE.

  • يعد الحصول على أذونات مستخدم معين مهمة إدارية ويجب عادةً إنجازها باستخدام واجهات برمجة التطبيقات الخاصة بخادم التطبيقات.
  • يعمل نموذج برمجة JAAS على مستوى أعلى من التجريد.إنه يوفر فقط المعلومات عما إذا كان المستخدم في دور J2EE (المحدد داخل التطبيق)

أعتقد أن JAAS تم تصميمه بحيث لا يسمح حقًا بما تحاول القيام به.أعلم في التطبيقات التي قمت بإنشائها أنني كنت بحاجة إلى هذا النوع من الوظائف التي اضطررت إلى تجاوز JAAS والبرمجة مباشرة إلى أي مستودع للهوية الفعلي، سواء كان LDAP أو ActiveDirectory أو أي شيء آخر.

في استخدام EJB

@Resource(mappedName = "java:comp/EJBContext")
protected SessionContext sessionContext;

وحاول مع context.lookup("java:comp/EJBContext") في أي مرحلة.


هذا الرمز مخصص لعائلة خوادم JBoss، أما الآخرون فيبحثون في JNDI الخاص بهم للعثور عليه.

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