Как программно получить доступ к ‹INTERCEPT-URL› из элемента ‹HTTP› в весенней безопасности

Как я могу программно получить доступ к содержимому объявлений URL-адресов перехвата (из http://www.springframework.org/schema/security схема)? Например.,

<http auto-config='true'>
    <intercept-url pattern="/static/**" filters="none" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    ...
</http>

Сопоставление ролей безопасности Spring используется для ограничения доступа к определенным страницам. Я хочу извлечь ту же информацию о сопоставлении ролей (атрибуты pattern и accept), чтобы отображать в html-меню только те страницы, к которым у каждой роли есть доступ. .

Я просмотрел HttpConfigurationBuilder, но он защищен пакетом и, похоже, не предлагает так много информации. Я также пробовал:

  FilterSecurityInterceptor interceptor = appContext.getBean(FilterSecurityInterceptor.class);
  if (interceptor != null) {
      for (ConfigAttribute attr : interceptor.getSecurityMetadataSource().getAllConfigAttributes()) {
          // Extract the attributes ... 
          attr.getAttribute();
      }
  }

но мне удалось получить доступ только к ролям, а не к шаблонам URL.


person Johan Sjöberg    schedule 28.01.2011    source источник


Ответы (2)


Конфигурация, объявленная с использованием поддержки пространства имен, не существует в том же «формате» после загрузки контекста приложения.

Если вы хотите сохранить информацию о сопоставлении ролей, вам необходимо получить к ней доступ во время синтаксического анализа конфигурации и сохранить данные, которые вам нужны для будущего использования. Вы можете сделать это, создав подкласс org.springframework.security.config.http.HttpSecurityBeanDefinitionParser, прочитав нужные данные и делегировав их super.

См. Spring Security 3 — Приложение D. .Расширяемая разработка XML для использования пользовательских BeanDefinitionParser реализаций.

person Boris Kirzner    schedule 23.02.2011

Возможно, вы можете проверить, дает ли метод getFilterChainMap() класса FilterChainProxy соответствующую информацию.

person Raghuram    schedule 28.01.2011
comment
Спасибо за Ваш ответ. К сожалению, это не дает мне необходимой информации. Ключ карты соответствует шаблону URL, поместите значение карты в цепочку фильтров (BasicAuthenticationFilter, securityContextHolderAwareRequestFilter,......, FilterSecurityInterceptor). Кажется, что я должен вручную разобрать контекст xml, чтобы добиться того, чего я хочу. - person Johan Sjöberg; 29.01.2011