Spring Security с Keycloak перенаправляют на вход даже с разрешением antmatcher - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть приложение с весенней загрузкой, которое должны прочитать все. Однако другие операции этого API должны выполняться только пользователями с ролью ADMIN. Для этого я использую Keycloak в качестве сервера авторизации. Конфигурация безопасности выглядит следующим образом.

package de.longuyen.csquoteservice.config;

import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
import org.keycloak.adapters.springsecurity.KeycloakSecurityComponents;
import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
import org.springframework.security.core.session.SessionRegistryImpl;
import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;

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

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) {
        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()
                .and()
                .authorizeRequests()
                .antMatchers(HttpMethod.GET, "/quote/**")
                .permitAll()
                .anyRequest()
                .authenticated()
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }
}

И это важная часть содержимого application.properties

keycloak.auth-server-url=https://domain.de/keycloak/auth
keycloak.realm=realm
keycloak.resource=client_id
keycloak.public-client=true
keycloak.principal-attribute=preferred_username

Каждый раз, когда я пытаюсь получить доступ к URL /quote с ПОЛУЧИТЬ, я перенаправлен на сайт входа Keycloak. Что я делаю не так?

1 Ответ

1 голос
/ 05 апреля 2020

Попробуйте, это должно работать.

@Override
protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http
                .csrf()
                .and()
                .authorizeRequests()
                .antMatchers(HttpMethod.GET, "/quote/**").permitAll()
                .antMatchers("/quote/**").hasRole("ADMIN")
                .anyRequest().authenticated()
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }
...