带有 keycloak 设置的 Spring Security (HttpSecurity)

Posted

技术标签:

【中文标题】带有 keycloak 设置的 Spring Security (HttpSecurity)【英文标题】:Spring security (HttpSecurity) with keycloak setup 【发布时间】:2021-07-04 00:25:49 【问题描述】:

我有以下设置:

    一个基于角度的前端,它与一个通信 基于 java 的后端,反过来进行通信 在组织中提供第 3 方服务。

前端/后端访问由查询 keycloak 服务器的 oauth2 保护。这个 keycloak 服务器对我的应用程序和我的后端正在访问的 3rd 方服务的用户进行身份验证。 获取第三方服务访问令牌的代码如下(其实这就是问题所在的代码:调用template.getAccessToken()时,另见下文):

  private void setAccessToken(HttpRequest request) 
    HttpHeaders headers = new HttpHeaders();
    OAuth2RestTemplate template = new OAuth2RestTemplate(resourceOwnerDetails());
    OAuth2AccessToken accessToken = template.getAccessToken();
    headers.setAuthorization("Bearer " + accessToken);
    request.setHeaders(headers);
  

安全配置如下:

  @Override
  protected void configure(HttpSecurity http) throws Exception 
    super.configure(http);
      http.requiresChannel()
          .anyRequest()
          .requiresSecure()
          .and()
          .cors()
          .and()
          .csrf()
          .disable()
          .sessionManagement()
          .sessionCreationPolicy(SessionCreationPolicy.ALWAYS)
          .sessionAuthenticationStrategy(sessionAuthenticationStrategy())
          .and()
          .authorizeRequests()
          .antMatchers("/accessdenied", "/accessdenied/**", "/style/*")
          .permitAll()
          .antMatchers("/")
          .hasAnyRole(allowedRoles)
          .anyRequest()
          .hasAnyRole(allowedRoles)
          .and()
          .exceptionHandling()
          .accessDeniedPage("/accessdenied");

当需要对前端/GUI 访问和后端查询的 3rd 方服务进行身份验证时,这可以正常工作。

我的问题如下: 在某些条件下(测试人员),我希望用户不必为前端/GUI 访问进行身份验证。但是,为了访问第 3 方服务,始终需要进行身份验证。

要在没有身份验证的情况下访问前端,我可以做一个简单的配置,例如:

 http.authorizeRequests().antMatchers("/**").permitAll().and().csrf().disable();

有了这个,我可以在没有经过身份验证的情况下访问 GUI(这是我想要的),但是当通过 template.getAccessToken()(见上文)获取 oauth2 访问令牌时,会引发异常

org.springframework.security.authentication.InsufficientAuthenticationException: Authentication is required to obtain an access token (anonymous not allowed)

所以,我认为我正在寻找的是正确的安全配置。 如何配置 Spring Security 使其不验证 GUI/前端访问但仍获取第 3 方服务的访问令牌?非常感谢任何指向正确方向的指针。

【问题讨论】:

【参考方案1】:

在 pom.xml 中

<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

在你的配置类中

    import org.springframework.security.oauth2.provider.token.TokenStore;
    import org.springframework.security.oauth2.provider.token.store.jwk.JwkTokenStore;

    @Configuration
    @EnableResourceServer

    public class ResourceServerConfig extends ResourceServerConfigurerAdapter 
        @Bean
        public TokenStore tokenStore() 
            return new JwkTokenStore("http://localhost:8080/auth/realms/master/protocol/openid-connect/certs");
        
    
    import org.springframework.security.oauth2.provider.token.TokenStore;
    import org.springframework.security.oauth2.provider.token.store.jwk.JwkTokenStore;

    @KeycloakConfiguration
    @Configuration
    @EnableWebSecurity
    @ComponentScan(
        basePackageClasses = KeycloakSecurityComponents.class
    )
    @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
    public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter 
        @Bean
        public TokenStore tokenStore() 
            return new JwkTokenStore("http://localhost:8080/auth/realms/master/protocol/openid-connect/certs");
        
    

【讨论】:

请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。

以上是关于带有 keycloak 设置的 Spring Security (HttpSecurity)的主要内容,如果未能解决你的问题,请参考以下文章

带有 Keycloak 的 Spring Security OAuth2 - 访问用户信息

Keycloak core deprecate class RSATokenVerifier,那么,换啥

带有 Keycloak 的 Angular/Spring Boot 抛出 403

带有外部身份提供者的 Keycloak 失败

带有 Keycloak 的 Spring 应用程序返回 401 错误

带有 Spring Boot KeycloakSecurityContext 的 Keycloak 始终为空