Я выставляю вам мою проблему.У меня есть веб-приложение, которое вызывает 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;
}
Спасибо за вашу помощь.