Spring Boot 我无法切换 keycloak 和基本身份验证

Posted

技术标签:

【中文标题】Spring Boot 我无法切换 keycloak 和基本身份验证【英文标题】:Spring Boot I can't switch keycloak and basic authentication 【发布时间】:2020-03-12 07:33:09 【问题描述】:

注意:我正在使用 Spring Boot 2.1.10 和 Keycloak 6.0.1 我希望我可以在 Web 应用程序 (MVC) 的启动时在基本身份验证和 SSO 之间进行选择。 所以我首先将 Spring Security + Keycloak 与 keycloak-spring-boot-starter 集成在一起

@SpringBootApplication
@EnableWebSecurity
public class KcApplication 
    public static void main(String[] args) 
        SpringApplication.run(KcApplication.class, args);
    

然后我定义了一个“sso”Spring 配置文件和一个默认配置:

application.properties 是这样的:

spring.application.name=@artifactId@
server.port: 8081
keycloak.enabled=false
spring.main.allow-bean-definition-overriding: true

application-sso.yml 是这样的:

keycloak:
  enabled: true
  auth-server-url: http://localhost:8180/auth
  realm: SpringBootRealm
  resource: spring-app
  credentials:
    secret: 0c8940a4-2065-4810-a366-02877802e762
  principal-attribute: preferred_username

然后我得到了两个不同的安全配置器:

@Configuration @Profile("!sso")
public class BasicAuthConfig extends WebSecurityConfigurerAdapter 
    @Override
    protected void configure(HttpSecurity http) throws Exception 
        super.configure(http);
        http.authorizeRequests()
            .antMatchers("/customers*").authenticated()
            .anyRequest().permitAll()
        .and().httpBasic()  //DEBUG can't force
        .and().logout().logoutSuccessUrl("/");
    


@Configuration @Profile("sso")
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
public class KeycloakAuthConfig extends KeycloakWebSecurityConfigurerAdapter 
    @Override
    protected void configure(HttpSecurity http) throws Exception 
        super.configure(http);
        http.authorizeRequests()
            .antMatchers("/customers*").authenticated()
            .anyRequest().permitAll();
    
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
        KeycloakAuthenticationProvider authProvider = keycloakAuthenticationProvider();
        authProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
        auth.authenticationProvider(authProvider);
    
    @Bean
    public KeycloakSpringBootConfigResolver keycloakConfigResolver() 
        return new KeycloakSpringBootConfigResolver();
    
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() 
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    

在这两种情况下,一切都顺利启动,并且“sso”配置文件的行为正确:输入 /consumers 路径首先会重定向到 Keycloak,然后在通过身份验证后返回。 但是我无法获取默认配置文件来登录。当输入 /consumers 时,我得到了一个匿名用户,没有被要求进行登录。

我猜这个问题来自我错过的一些东西,所以我把尽可能多的东西放在上面。有谁知道为什么我无法登录,尽管正确的配置器是在调试时运行的? 谢谢

【问题讨论】:

仅供参考,这里是用于构建该试用版的原始教程baeldung.com/spring-boot-keycloak 【参考方案1】:

嗯,重置会话花了周末,然后它起作用了! 证明它可能是错误的注销......我什至不难过:-(

【讨论】:

以上是关于Spring Boot 我无法切换 keycloak 和基本身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot REST API 仅接受来自 Angular 前端的调用

Spring Boot / JPA / Hibernate,如何根据 Spring 配置文件切换数据库供应商?

spring boot项目进行war部署,对于静态资源无法访问的问题

努力在运行时使用 Spring Boot 在数据库之间切换

43. Spring Boot动态数据源(多数据源自动切换)从零开始学Spring Boot

Spring Boot postgresql嵌入式tomcat启动失败