Я получаю сообщение об ошибке состояния 401: неавторизовано, когда я пытаюсь вызвать мой защищенный API с помощью keycloak - PullRequest
0 голосов
/ 28 декабря 2018

Я выставляю вам мою проблему.У меня есть веб-приложение, которое вызывает REST API, чтобы найти корзину клиента.Приложение и API защищены пружинной защитой и SSO Keycloak.

На самом деле, мое веб-приложение работает, если мое API не защищает, все готово.

Но когда яхочу защитить мой API с ролью, у меня каждый раз, когда ошибка 401 ошибка: неавторизован.На самом деле это хорошо, мой API защищен, но клиент с ролью «ПОЛЬЗОВАТЕЛЬ» не может получить доступ к его корзине.

Когда я пытаюсь перенести токен на предъявителя в брелок, это хороший токен (в прошломв jwt.io).Я пытался использовать curl, но результат тот же.

Я использую Feign в своем веб-приложении для вызова API.

Моя конфигурация Keycloak в моем API

@Configuration
@EnableWebSecurity
@ConditionalOnProperty(name = "keycloak.enabled", havingValue = "true", matchIfMissing = true)
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
public static class KeycloakConfigurationAdapter extends KeycloakWebSecurityConfigurerAdapter{

    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new NullAuthenticatedSessionStrategy();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Bean
    public KeycloakConfigResolver KeycloakConfigResolver(){
        return new KeycloakSpringBootConfigResolver();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
                .csrf().disable()
                .sessionManagement()
                    .sessionAuthenticationStrategy(sessionAuthenticationStrategy())
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)

                .and()
                    .addFilterBefore(keycloakPreAuthActionsFilter(), LogoutFilter.class)
                    .addFilterBefore(keycloakAuthenticationProcessingFilter(), X509AuthenticationFilter.class)
                    .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint())

                .and()
                    .authorizeRequests().antMatchers(HttpMethod.OPTIONS).permitAll()
                    .antMatchers("/paniers/**").hasAuthority("USER")
                    .antMatchers("/commandes/**").hasRole("USER")
                    .anyRequest().permitAll();
    }
}

Мои .properties для API

keycloak.auth-server-url=http://myserver:port/auth
keycloak.realm=wild_adventures
keycloak.resource=ms-commande
keycloak.credentials.secret=#######-####-####-####-###########
keycloak.bearer-only=true

Мой метод в контроллере API

@ApiOperation(value = "Récupère le panier avec la liste des évenements réservés ou renvoie un 404 NotFound")
@GetMapping(value = "paniers/{clientUuid}")
public Panier recupererPanier(@PathVariable(value = "clientUuid") String clientUuid) {

    Panier panier = this.panierManager.getPanierByClientUuid(clientUuid);

    if(panier == null)
        throw new PanierInexistantException("Le panier n'a pas été trouvé");

    return panier;
}

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Хорошо, после некоторого исследования я нашел причину моей проблемы.

Во-первых, Zuul защитил заголовок авторизации моего запроса ... Чтобы решить эту проблему, я добавил эту строку в мои свойства "zuul.sensHeaders: Cookie, Set-Cookie "(Итак, Zuul просто защищает Cookie и Set-Cookie).

Далее, в моем коде я отправляю хороший токен, но мне нужно было указать" Bearer "перед строкой моего токена.

Может быть, это решение кому-нибудь поможет:)

0 голосов
/ 28 декабря 2018

Я заметил, что вы смешали hasAuthority и hasRole методы в вашей конфигурации безопасности.Должно быть либо hasAuthority("ROLE_USER"), либо hasRole("USER").Вы проверили, работает ли у вас ресурс "/commandes/**"?

...