2015-04-06 21 views
7

У меня есть вопросы по следующим темам: весенняя и весенняя безопасность.Весенняя сессия и весенняя безопасность

Spring Session

У меня есть приложение, защищенное с Spring Security через обычную проверку подлинности в памяти, как это предусмотрено в примере образца.

Я вижу, что весна создает идентификатор сеанса, даже аутентификация не увенчалась успехом, что означает, что я вижу x-auth-token в заголовке ответа, а также в Redis DB, даже если я не предоставляю базовые данные учетной записи аутентификации. Как избежать создания сеансов для сбоев аутентификации?

Spring Security

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

Предполагая, что API Signin (/ signin - HTTP Post) проверяет (имя пользователя & пароль) учетные данные для стороннего REST API.

Как только внешний API проверяет учетные данные, как обновить контекст безопасности весны при успешной аутентификации?

Должен быть утвержден доступ к другим защищенным ресурсам с помощью x-auth-token и на основе доступа к предоставленному ресурсу информации.

Нужно ли иметь весеннюю безопасность в этом случае или использовать базовый фильтр и весеннюю сессию? Что рекомендуется?

ответ

11

Как правило, было бы лучше разбить ваши вопросы на несколько вопросов StackOverflow, так как вы с большей вероятностью найдёте кого-то, кто знает ответ на один вопрос, чем оба.

Как избежать сеансов для сбоев аутентификации?

По умолчанию Spring Security сохранит последний неавторизованный запрос на сеанс, чтобы после проверки подлинности он мог автоматически выполнить запрос еще раз. Например, в браузере, если вы запрашиваете example.com/a/b/c и не прошли проверку подлинности, он сохранит example.com/a/b/c в HttpSession и затем аутентифицирует пользователя. После аутентификации он автоматически предоставит вам результат example.com/a/b/c. Это обеспечивает приятный пользовательский интерфейс, поэтому пользователям не нужно снова вводить URL.

В случае услуги REST это необязательно, так как клиент будет помнить, какой URL-адрес нужно запросить повторно. Вы можете предотвратить сохранение путем изменения конфигурации использовать NullRequestCache, как показано ниже:

protected void configure(HttpSecurity http) throws Exception { 
    http 
     .authorizeRequests() 
      .anyRequest().authenticated() 
      .and() 
     .requestCache() 
      .requestCache(new NullRequestCache()) 
      .and() 
     .httpBasic(); 
} 

Вы можете обеспечить пользовательскую проверку подлинности, указав свой собственный AuthenticationProvider.Например:

import org.springframework.security.authentication.AuthenticationProvider; 
import org.springframework.security.authentication.BadCredentialsException; 
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 
import org.springframework.security.core.Authentication; 
import org.springframework.security.core.AuthenticationException; 
import org.springframework.security.core.authority.AuthorityUtils; 

public class RestAuthenticationProvider implements AuthenticationProvider { 

    public Authentication authenticate(Authentication authentication) 
      throws AuthenticationException { 
     UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) authentication; 

     String username = token.getName(); 
     String password = (String) token.getCredentials(); 

     // validate making REST call 
     boolean success = true; 
     // likely your REST call will return the roles for the user 
     String[] roles = new String[] { "ROLE_USER" }; 

     if(!success) { 
      throw new BadCredentialsException("Bad credentials"); 
     } 

     return new UsernamePasswordAuthenticationToken(username, null, AuthorityUtils.createAuthorityList(roles)); 
    } 

    public boolean supports(Class<?> authentication) { 
     return (UsernamePasswordAuthenticationToken.class 
       .isAssignableFrom(authentication)); 
    } 

} 

Вы можете настроить RestAuthenticationProvider используя что-то вроде этого:

@EnableWebSecurity 
@Configuration 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 
    ... 

    @Bean 
    public RestAuthenticationProvider restAuthenticationProvider() { 
     return new RestAuthenticationProvider(); 
    } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth, AuthenticationProvider provider) throws Exception { 
     auth 
      .authenticationProvider(provider); 
    } 
} 
+0

Спасибо, грабеж, я постараюсь сломать свои вопросы на несколько сообщений. я попробую ваши ответы и вернусь к вам. Еще раз большое вам спасибо и извините за задержанный ответ –

+0

, где вы помещаете метод configure? – snowe

0

идентификаторы сеансов становятся хранятся в Redis, даже если проверка не прошла.

Ответ Роба на установку NullRequestCache не сработал для меня. То есть были записи redis даже после установки кэша запросов в NullRequestCache. Чтобы он работал, мне пришлось использовать обработчик ошибок проверки подлинности.

http.formLogin().failureHandler(authenticationFailureHandler()).permitAll(); 

private AuthenticationFailureHandler authenticationFailureHandler() { 
    return new AuthenticationFailureHandler(); 
} 

public class AuthenticationFailureHandler 
    extends SimpleUrlAuthenticationFailureHandler { 
} 

Обратите внимание, что обработчик отказа не делает ничего, кроме явного расширения обработчика по умолчанию. Он возвращает 401 в случае отказа. Если вы делаете переадресацию, вы можете легко настроить ее в обработчике.

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