2015-01-21 1 views
2

Я работаю над проектом веб-приложения Spring Boot, настроенным аннотациями. Я успешно настроил Spring-security, чтобы добавить базовую аутентификацию на некоторые URL-адреса и sso на другие. Но на самом деле я должен изменить это поведение для достижения этой цели:Дифференциальные способы аутентификации на одних и тех же URL-адресах с весенней загрузкой

Все мои адреса защищены с помощью обоих методов аутентификации, чтобы определить способ использования я должен прочитать заголовкам запроса: если есть ppauth маркер, Я попробую аутентификацию sso, и если у меня есть заголовок Authoriation: Basic, я попробую Basic auth. В другом случае аутентификация завершается с ошибкой.

В документации весной загрузки пример очень прост, он показывает использование WebSecurityConfigurerAdapter, на самом деле мы можем определить метод аутентификации по различным шаблонам URL-адресов, но не другими заголовками предикатов.

Есть ли у кого-то идея?

ответ

0

Наконец я получил решение этой проблемы, поэтому я кратко поделиться:

Таким образом, мы имеем несколько способов аутентификации, описанный в нескольких классах, проходящих AbstractPreAuthenticatedProcessingFilter. (Все те, которые не будут добавлены в цепочку фильтров)

В верхней части, что мы получили MultiAuthModeSecurityFilter, этот класс будут добавлены в цепочку фильтров приложения:

Внутри configure способа WebSecurityConfigurerAdapter

http.addFilterBefore(new MultiAuthModeSecurityFilter(
       FirstSecurityFilter(), 
       SecondSecurityFilter(), 
       ThirdSecurityFilter()), RequestCacheAwareFilter.class); 

Так MultiAuthModeSecurityFilter знает всю нашу стратегию безопасности и направит запрос на правильный фильтр, выполнив:

@Override 
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
      /*some actions to define the right authMethod to use*/ 
      switch (authMethod) { 
       case FIRST: 
        firstFilter.doFilter(servletRequest, servletResponse, filterChain); 
        break; 
       case SECOND: 
        secondFilter.doFilter(servletRequest, servletResponse, filterChain); 
        break; 
       case THIRD: 
        thirdFilter.doFilter(servletRequest, servletResponse, filterChain); 
        break; 
       default: 
        /* throws exception */ break; 
      } 
     } 

Надеюсь, это вам поможет!

0

Существует всегда более чем один способ сделать что-то. В этом случае проще всего написать свой фильтр sso таким образом, чтобы он продолжался с цепочкой, если нет настраиваемого заголовка, и поместите его перед базовым фильтром auth. Затем, если ваш пользовательский фильтр пропускает запрос, он будет обрабатываться базовым auth.

+0

Есть ли у вас примеры того, как это сделать с весенним ботинком? – mcamier

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