Угловой с пружиной безопасности.Заголовок авторизации пуст - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь интегрировать безопасность 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, как если бы токен аутентификации отсутствовал:

enter image description here

В журналах предлагается следующее:

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 (не из углового кода), он, похоже, будет работать нормально.

Может кто-нибудь помочь, пожалуйста? Чего мне не хватает?

Спасибо, Питер

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...