4

Я использую Spring security 4.0.1 внутри весенней загрузки 1.2.3 веб-приложения (а также с Spring-session 1.0.1, но это не имеет отношения к делу).Неверный сеанс безопасности Spring

У меня есть частная зона и вся область доступа («/ about», «/», «/ contact», ... более 20 страниц), для которой каждый пользователь может получить доступ. (Это как веб-магазина)

Всякий раз, когда вошедшего в пользователя истекают сеанса, Spring обнаруживает недопустимый сеанс и перенаправляет пользователя на «.invalidSessionUrl („/ сессия/ошибка/недопустимый“)»

Однако, я хочу только перенаправить, если целевая ссылка внутри частной области или общедоступная.

Как я могу избежать этого?

Спасибо.

Это моя (Java) конфигурация: (обновлен после увиденного поста)

http 
      .authorizeRequests() 
      .anyRequest() 
       .permitAll() 
      .antMatchers("/privado/**") 
       .authenticated() 
      .and() 
       .formLogin() 
       .loginPage("/login") 
       .failureUrl("/login?error") 
       .defaultSuccessUrl("/") 
       .successHandler(new SessionSuccessHandler()) 
      .and() 
       .logout() 
       .logoutSuccessUrl("/") 
       .deleteCookies("JSESSIONID", "SESSION") 
      .and() 
       .sessionManagement() 
       .invalidSessionUrl("/session/error/invalid") 
      .sessionFixation() 
      .changeSessionId() 
      .maximumSessions(1) 
      .expiredUrl("/session/error/expired") 
      .and() 
      .and() 
       .csrf() 
       .ignoringAntMatchers("/jolokia/**", "/v1.0/**"); 

Как я могу добиться этого?

Большое спасибо.

+0

Посмотрите здесь http://stackoverflow.com/questions/22767205/spring-security-exclude-url-patterns-in-security-annotation-configurartion –

+0

Не работает должным образом. – josete

ответ

0

Для этого вы можете создать пользовательскую SessionAuthenticationStrategy. Например:

public class MatcherSessionAuthenticationStrategy implements SessionAuthenticationStrategy { 

    private final SessionAuthenticationStrategy delegate; 

    private final RequestMatcher matcher; 

    public MatcherSessionAuthenticationStrategy(
      SessionAuthenticationStrategy delegate, RequestMatcher matcher) { 
     super(); 
     this.delegate = delegate; 
     this.matcher = matcher; 
    } 

    public void onAuthentication(Authentication authentication, 
      HttpServletRequest request, HttpServletResponse response) 
      throws SessionAuthenticationException { 
     if(matcher.matches(request)) { 
      delegate.onAuthentication(authentication, request, response); 
     } 
    } 
} 

Затем вы можете придать RequestMatcher и ConcurrentSessionControlAuthenticationStrategy в классе. Самый простой способ настроить это было бы создать BeanPostProcessor:

public class ConcurrentSessionControlAuthenticationStrategyBeanPostProcessor 
     implements BeanPostProcessor { 

    public Object postProcessBeforeInitialization(Object bean, String beanName) 
      throws BeansException { 
     return bean; 
    } 

    public Object postProcessAfterInitialization(Object bean, String beanName) 
      throws BeansException { 
     if(!(bean instanceof CompositeSessionAuthenticationStrategy)) { 
      return bean; 
     } 

     RequestMatcher matcher = antMatchers("/about", "/","/contact"); 
     SessionAuthenticationStrategy original = (SessionAuthenticationStrategy) bean; 
     return new MatcherSessionAuthenticationStrategy(original, matcher); 
    } 

    /** 
    * Create a {@link List} of {@link AntPathRequestMatcher} instances. 
    * 
    * @param httpMethod the {@link HttpMethod} to use or {@code null} for any 
    * {@link HttpMethod}. 
    * @param antPatterns the ant patterns to create {@link AntPathRequestMatcher} 
    * from 
    * 
    * @return an OrRequestMatcher with a {@link List} of {@link AntPathRequestMatcher} instances 
    */ 
    public static RequestMatcher antMatchers(
      String... antPatterns) { 
     List<RequestMatcher> matchers = new ArrayList<RequestMatcher>(); 
     for (String pattern : antPatterns) { 
      matchers.add(new AntPathRequestMatcher(pattern)); 
     } 
     return new OrRequestMatcher(matchers); 
    } 
} 

Вы можете добавить следующие строки в конфигурации:

@Bean 
public static BeanPostProcessor sessionBeanPostProcessor() { 
    return new ConcurrentSessionControlAuthenticationStrategyBeanPostProcessor(); 
} 

Важно использовать статический метод, так как это BeanPostProcessor которые необходимо будет инициализировать на раннем этапе.

PS Я бы рассмотреть форматирование конфигурации, как outlined in this blog

+0

Это не работает. Из того, что я могу сказать, учитывая, что его вся область доступа является разрешением, все пользователи будут связаны с AnonymousAuthenticationToken и в SessionManagementFilter - единственный способ доступа к sessionAuthenticationStrategy.onAuthentication call, если выполняется следующая проверка: аутентификация! = null &&! trustResolver.isAnonymous (аутентификация)). Учитывая, что пользователь анонимен, он терпит неудачу и переходит непосредственно к фрагменту кода, который скорее всего вызовет invalidSessionStrategy.onInvalidSessionDetected, который будет выполнять перенаправление. Текущая мысль заключается в добавлении пользовательской недействительнойSessionStrategy –

2

@RobWinch - Это, кажется, как довольно общий случай использования и решение вы предлагаете, кажется, не работает из теста я побежал а также комментарии. Аналогичная проблема была поднята. Я верю в http://forum.spring.io/forum/spring-projects/security/94772-redirect-to-invalid-session-url-only-when-user-accesses-secured-resource, и, похоже, она никогда не была решена. Мое мышление, чтобы иметь несколько параметров HTTP (с использованием XML-конфигурации)

<http pattern="/aboutUs**" security="none" /> 
<http pattern="/contact**" security="none" /> 
etc 

Это не кажется идеальным, имея довольно много незащищенные страницы, а также добавление новой необеспеченной страницы требуется обновление конфигурации. Будет хорошо, если у нас может быть «идеальное» решение для этого варианта использования. С выпуском Spring security 4.1, похоже, до сих пор нет четкого способа сделать это.

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