Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Java Spring Boot. При базовой авторизации не сохраняется аттрибут SPRING_SECURITY_CONTEXT в сессию Redis. Как исправить?

Вася Сухов Ученик (77), на голосовании 3 месяца назад
@EnableWebFluxSecurity
@Configuration
public class SecurityConfig {
@Bean
public LdapAuthoritiesPopulator ldapAuthoritiesPopulator(UserService service) {
return (userData, username) -> {
Set<GrantedAuthority> authorities = new HashSet<>();
service.findByCn(username).ifPresent(user -> {
authorities.add(new SimpleGrantedAuthority(user.getRole().name()));
});
return authorities;
};
}

@Bean
public BindAuthenticator bindAuthenticator(BaseLdapPathContextSource contextSource) {
BindAuthenticator authenticator = new BindAuthenticator(contextSource);
authenticator.setUserDnPatterns(new String[]{"cn={0},ou=users"});
return authenticator;
}

@Bean
public ReactiveAuthenticationManager reactiveAuthenticationManager(BindAuthenticator bindAuthenticator,
LdapAuthoritiesPopulator authoritiesPopulator) {
return authentication -> Mono.just(authentication)
.flatMap(auth -> {
String username = auth.getName();
String password = auth.getCredentials().toString();
try {
bindAuthenticator.authenticate(new org.springframework.security .authentication.UsernamePasswordAuthenticationToken(username, password));
Set<GrantedAuthority> authorities = new HashSet<>(authoritiesPopulator.getGrantedAuthorities(null, username));
User userDetails = new User(username, password, authorities);
return Mono.just(new org.springframework.security .authentication.UsernamePasswordAuthenticationToken(userDetails, password, authorities));
} catch (AuthenticationException e) {
return Mono.error(e);
}
});
}

@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
return http
.csrf(ServerHttpSecurity.CsrfSpec::disable)
.cors(cors -> cors.configurationSource(_ ->
new CorsConfiguration().applyPermitDefaultValues()
))
.authorizeExchange(exchange ->
exchange.pathMatchers("/login*", "/").permitAll()
.anyExchange().authenticated())
.formLogin(Customizer.withDefaults())
.httpBasic(Customizer.withDefaults())
.build();
}
}

Указываю заголовок Authorization: Basic <логин>:<пароль> (зашифровано). Через отладку проверил - авторизация проходит. В redis создаётся запись, но она не содержит контекст. При авторизации через форму контекст сохраняется. Можно ли как-то добиться того, чтобы и при базовой авторизации контекст сохранялся тоже? Я пробовал добавить пункт .securityContextRepository, в итоге создаётся две сессии - одна без контекста, а другая с контекстом, но она не используется.
Голосование за лучший ответ
Похожие вопросы