Как обрабатывать исключения KeycloakWebSecurityConfigurerAdapter (например, через CommonExceptionsHandler)?

avatar
norym
8 августа 2021 в 18:06
22
0
0

У меня очень простая конфигурация Keycloak, которая расширяет KeycloakWebSecurityConfigurerAdapter.

@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
class KeycloakConfiguration extends KeycloakWebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {

        KeycloakAuthenticationProvider keycloakAuthenticationProvider =
            keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

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

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

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

        http
            .csrf()
            .disable()
            .authorizeRequests()
            .antMatchers("/api*")
            .hasRole("user")
            .anyRequest()
            .permitAll();
    }
}

Теперь мне интересно, как обрабатывать и управлять исключениями, создаваемыми KeycloakConfiguration. Конфигурация возвращает 401 или 403 в зависимости от запроса без проверки подлинности или без проверки подлинности.

Я предполагаю, что HTTP-статусы 401 и 403 являются результатом исключений, вызванных базовым адаптером, возможно, AccessDeniedException или около того.

  1. Как мне обрабатывать эти исключения?
  2. Как настроить ответы 401 и 403 соответственно?
  3. У меня есть CommonExceptionsHandler через RestControllerAdvice, который обрабатывает исключения, выдаваемые на прикладном уровне через @ExceptionHandler(...), и подготавливает соответствующий ответ ResponseEntity. Как я могу обрабатывать исключения конфигурации Keycloak через мой CommonExceptionsHandler? На данный момент я думаю, что не могу обработать это через свой CommonExceptionsHandler, поскольку запросы обрабатываются до того, как сработает даже API контроллера. Если да, то как я могу получить аналогичный вывод для ответов конфигурации Keycloak.

pom.xml:

...
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>2.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.keycloak</groupId>
            <artifactId>keycloak-spring-boot-starter</artifactId>
        </dependency>
    
...
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.keycloak.bom</groupId>
                <artifactId>keycloak-adapter-bom</artifactId>
                <version>14.0.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
Источник

Ответы (0)