Spring Security - SecurityContext.Authentication null في Taglib و JSP ولكن موافق في وحدة التحكم
-
21-09-2019 - |
سؤال
لقد كنت أعاني من هذه المشكلة لفترة قصيرة الآن. وجدت عدة مشاركات حول هذا الموضوع ولكن لم يحل أي مشكلتي. من المحتمل أن يكون له علاقة بحقيقة أن SecurityContext هو boud لخيط معين ولكن حتى ذلك الحين لا أعرف كيفية حلها:
النظر في التعليمات البرمجية التالية لاسترداد المستخدم الذي تم تسجيل الدخول:
SecurityContextHolder.getContext().getAuthentication().getPrincipal()
سيتم تشغيل هذا الرمز في وحدة تحكم (بشكل صحيح) قام المستخدم بتسجيل الدخول. تشغيل هذا الرمز من Taglib أو JSP يلقي NPE (المصادقة = NULL). أيضا علامة الربيع لا يعمل (من المفترض لنفس السبب).
استخراج من web.xml:
<filter>
<filter-name>AcegiFilter</filter-name>
<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>org.acegisecurity.util.FilterChainProxy</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>AcegiFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
استخراج من ملف تكوين أمان الربيع:
<bean id="filterChainProxy" class="org.springframework.security.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=httpSessionIntegrationFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor
</value>
</property>
</bean>
<bean id="filterSecurityInterceptor"
class="org.springframework.security.intercept.web.FilterSecurityInterceptor">
<property name="authenticationManager" ref="authenticationManager" />
<property name="accessDecisionManager" ref="accessDecisionManager" />
<property name="alwaysReauthenticate" value="true" />
<property name="objectDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/myaccount.htm=ROLE_CUSTOMER
</value>
</property>
</bean>
المحلول
تم الحل
نشأت المشكلة من تسلسل المرشح. تم استدعاء PageFilter (Sitemesh) قبل مرشح أمن الربيع وبسبب هذا ، لم يكن سياق الأمان متاحًا بعد في JSP. تغيير ترتيب المرشحات في web.xml (مرشح الأمان أولاً) إصلاح المشكلة.
نصائح أخرى
قد يبدو هذا سؤالًا واضحًا ، لكن هل أجبرت المستخدم على تسجيل الدخول (أي المصادقة) في أي وقت قبل الوصول إلى الصفحة /مي Councount.htm؟ لم أر أي تعيينات إلى صفحة تسجيل دخول تتطلب وصول مجهول في مصدر تعريف الكائن الخاص بك وهذا هو السبب في أنني أسأل. إذا تمكن المستخدم من الوصول إلى /مي Councount.htm دون المصادقة ، فلن يتم إنشاء أي مدير في سياق الأمان بحلول الوقت الذي وصلوا فيه إلى الصفحة ، وبالتالي nullpointerxception. أيضا ، هل تستخدم المصادقة القائمة على النموذج؟ HTTP المصادقة الأساسية؟ هناك نوع آخر تدعمه ACEGI؟