Spring-Boot 403 «Доступ запрещен» для аутентифицированного пользователя - PullRequest
0 голосов
/ 03 октября 2019

Spring-Boot 2.1.4. Выпуск + Angular 6 (два автономных приложения).

У меня есть и пользовательский интерфейс, и API, развернутые на PCF. Мы используем пользовательский SSO (поток auth_code), который привязан к серверу API PCF в качестве посредника служб.

В приложении Angular UI есть прокси и локальный прокси для запуска на PCF или localhost API соответственно. Когда я запускаю оба приложения локально или на PCF, проблем не возникает, но когда я указываю свой локальный пользовательский интерфейс на PCF API, я получаю 403.

Перенаправление пользователя на единый вход в систему обрабатывается на пользовательском интерфейсе! Так что autoMagicConfiguration при весенней загрузке отключена. По сути, я вручную вызываю / авторизую, / token & / userinfo enpdoints и затем устанавливаю принципала в SecurityContext.


    @Configuration
    @EnableWebSecurity
    @Order(value = 0)
    public class SsoConfiguration extends WebSecurityConfigurerAdapter {


    @Bean
    @Order(0)
    public RequestContextListener requestContextListener() {
        return new RequestContextListener();
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                .csrf()
                .disable()
                .authorizeRequests()
                .antMatchers(Constants.AUTH_WHITELIST)
                .permitAll()
                .anyRequest()
                .authenticated();
    }

    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers(Constants.SWAGGER_WHITELIST);
    }
    }

LoginService

    public CustomUser login(LoginRequest request) throws JSONException {

        ServiceConfiguration configuration = 
        cacheService.getConfigurations(Enums.ServiceName.SSO);
        String token = getToken(configuration, request);
        CustomUser user = userRepository.getUser(configuration, token);
        cacheService.getCachedUser(user);

        Authentication authentication =
                new UsernamePasswordAuthenticationToken(user, null, 
        user.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authentication);
        return user;
    }

    public void logout(HttpServletRequest request, HttpServletResponse response) 
    {

        Authentication authentication = 
    SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null) {
            new SecurityContextLogoutHandler().logout(request, response, 
    authentication);
            cacheService.clearCachedUser((CustomUser ) 
    authentication.getPrincipal());
        }
    }

LoginRequest содержит authCode и получен из SSOвход в систему и перенаправление uri для последующих вызовов (/ token & / userinfo)

CustomUser реализует UserDetails вместе с другими полями, возвращаемыми SSO

Вот снимки экрана вызовов для защищенных конечных точек из UI => API: 1) PCF в PCF. PCF to PCF 2) Localhost to Localhost. Localhost to Localhost. 3) Локальный хост для PCF Localhost to PCF Вот прокси на пользовательском интерфейсе UI Proxies Метод Post / Get, используемый пользовательским интерфейсом httpClient enter image description here Мы используем Redis для кэширования, и я заметил, что когда я захожу на сайт, он добавляет сеанс в Redis. Сеанс не удаляется при выходе из системы, если только я вручную не очистил Redis или не вызвал

@CacheEvict(cacheNames = "my-cache", allEntries = true)

Я попытался отключить сеанс Redis с помощью updating app.properties

, но, похоже,в любом случае установить сеанс в Redis. SSO

Может ли это быть из-за сеанса?

...