5

Я немного борюсь с этой проблемой. Нашел несколько сообщений об этом, но никто не решил мою проблему. Это, вероятно, что-то делать с тем фактом, что SecurityContext является Boud к конкретной теме, но даже тогда я не знаю, как решить эту проблему:Spring security - SecurityContext.authentication null в taglib и jsp, но нормально в контроллере

Рассмотрит следующий код для извлечения пользователя, который был зарегистрирован в:

SecurityContextHolder.getContext().getAuthentication().getPrincipal() 

Выполнение этого кода в контроллере будет возвращено (правильно) вошедшему пользователю. Запуск этого кода из taglib или jsp throws NPE (authentication = 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> 
+0

Можем ли мы увидеть образец JSP, который производит это условие? Вы импортируете taglib Spring Security в свой заголовок страницы? – Gandalf

ответ

5

ПОСТАНОВИЛИ

проблема возникла из последовательности фильтра. Фильтр PageFilter (sitemesh) был вызван до фильтра безопасности весны, и из-за этого контекст безопасности еще не был доступен в jsp. Изменение порядка фильтров в web.xml (первый фильтр безопасности) устранило проблему.

0

Это может показаться очевидным вопрос, но вы вынуждены пользователю войти в систему (т.е. аутентифицировать) в любой момент до их доступа к странице /myaccount.htm? Я не видел никаких сопоставлений на странице входа, требующей анонимного доступа в источнике определения объекта, поэтому я спрашиваю. Если пользователь может получить доступ к /myaccount.htm без проверки подлинности, то к моменту, когда они обратились к странице, в контексте безопасности не было бы создано ни одного принципала, следовательно, это исключение NullPointerException. Кроме того, вы используете проверку подлинности на основе форм? Проверка подлинности HTTP BASIC? Некоторые другие типы поддерживаются Acegi?

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