Я пытаюсь интегрировать безопасность Spring (версия 2.1.1.RELEASE) с Angular.
Угловая версия:
@ angular-devkit / architect 0.13.4
@ angular-devkit / core 7.3.4
@ angular-devkit / schematics 7.3.4
@ schematics / angular 7.3.4
@ schematics / update 0.13.4
rxjs 6.3.3
машинопись 3.2.4
Когда я делаю вход в систему, мой идентификатор сеанса отправляется на стороне клиента и является моим локальным хранилищем, и я пытаюсь добавить его в запросы, которые я делаю:
...
@Injectable()
export class BasicAuthInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// add authorization header with basic auth credentials if available
let currentUser = JSON.parse(localStorage.getItem('currentUser'));
if (currentUser && currentUser.authdata) {
request = request.clone({
setHeaders: {
Authorization: `Basic ${currentUser.authdata}`,
'X-Auth-Token' : `${currentUser.authdata}`
}
});
}
return next.handle(request);
}
}
Моя конфигурация:
@Configuration
@EnableWebSecurity
@EnableJdbcHttpSession
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED).and()
.httpBasic().and()
.cors().configurationSource(corsFilter()).and()
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS,"/**").permitAll()
.antMatchers("/index.html", "/", "/user", "/loginRest", "/login","/error").permitAll()
.antMatchers("/bo/*").hasAnyRole("USER")
//.anyRequest().fullyAuthenticated()
.anyRequest().authenticated().and()
.csrf().disable()
;
}
@Bean
@Override
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
public UrlBasedCorsConfigurationSource corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("GET");
config.addAllowedMethod("POST");
config.addAllowedMethod("PUT");
config.addAllowedMethod("DELETE");
source.registerCorsConfiguration("/**", config);
return source;
}
@Bean
public HttpSessionIdResolver httpSessionIdResolver() {
return HeaderHttpSessionIdResolver.xAuthToken();
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
Однако, всякий раз, когда я вызываю ресурс с / bo / *, я получаю 401, как если бы токен аутентификации отсутствовал:

В журналах предлагается следующее:
2019-03-10 00: 33: 11,739 [http-nio-8080-exec-2] DEBUG
org.springframework.security.web.FilterChainProxy -
/ bo / retrieveOfferConfig в позиции 1 из 12 в дополнительном фильтре
цепь; Фильтр срабатывания: 'WebAsyncManagerIntegrationFilter' 2019-03-10
00: 33: 11,739 [http-nio-8080-exec-2] DEBUG
org.springframework.security.web.FilterChainProxy -
/ bo / retrieveOfferConfig в позиции 2 из 12 в дополнительном фильтре
цепь; Фильтр срабатывания: 'SecurityContextPersistenceFilter' 2019-03-10
00: 33: 11,739 [http-nio-8080-exec-2] DEBUG
org.springframework.session.web.http.SessionRepositoryFilter.SESSION_LOGGER
- Идентификатор сеанса не найден: результат кэширования для getSession (false) для этого запроса HttpServletRequest. 2019-03-10 00: 33: 11,739
[http-nio-8080-exec-2] DEBUG
org.springframework.security.web.context.HttpSessionSecurityContextRepository
- HttpSession в настоящее время не существует
Итак, я скачал исходники для SessionRepositoryFilter, вошел в режим отладки, и оказалось, что заголовок действительно отсутствует, хотя chrome предложил иное.
Интересный факт: если я получу идентификатор сеанса и добавлю его к параметрам запроса chrome (не из углового кода), он, похоже, будет работать нормально.
Может кто-нибудь помочь, пожалуйста?
Чего мне не хватает?
Спасибо,
Питер