Spring 启动 - 如何禁用 Keycloak?

Spring Boot - How to disable Keycloak?

我有一个 Spring 集成了 keycloak 的引导项目。现在我想禁用 keycloak 以进行测试。

我尝试按照 Keycloak documentation 中的说明将 keycloak.enabled=false 添加到 application.properties,但没有成功。

那么我该如何禁用它呢?

应该可以,但是根据 jira ticket 上的最后一条评论,似乎不行。

如描述所述,您可以排除添加到 application.properties 的密钥斗篷的 spring 启动自动配置:spring.autoconfigure.exclude=org.keycloak.adapters.springboot.KeycloakSpringBootConfiguration

您需要排除 keycloak 自动配置。为此,只需将此条目添加到相关的 spring 配置文件中,在您的情况下为 application.properties。

spring.autoconfigure.exclude = org.keycloak.adapters.springboot.KeycloakAutoConfiguration

对于可能遇到同样问题的任何人,这就是我所做的。

我没有禁用 Keycloak,但为了测试目的我制作了一个单独的 Keycloak 配置文件。

这是我的配置文件

@Profile("test")
@Configuration
@EnableWebSecurity
public class SecurityTestConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/**").permitAll();
        http.headers().frameOptions().disable();
        http.csrf().disable();

    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/**");
    }

    @Bean
    @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public AccessToken accessToken() {
        AccessToken accessToken = new AccessToken();
        accessToken.setSubject("abc");
        accessToken.setName("Tester");

        return accessToken;

    }

}

请注意,仅在测试环境中使用它很重要,因此我将配置注释为 @Profile("test")。我还添加了一个 AccessToken bean,因为我的应用程序中的一些审计功能依赖于它。

我的解决方法:

1. 创建自定义过滤器并将其添加到 (Spring) 安全链的早期位置。
2. 在 application.yml (securityEnabled)
中创建一个标志 3.查询Custom-Filter中的flag。如果 'true' 只需调用 chain.doFilter() 继续下一个过滤器。如果 'false' 创建一个虚拟的 Keycloak-Account 设置你需要的角色并将其设置为上下文。
4.顺便说一句,角色也外包给application.yml
5. 跳过安全链中的其余过滤器(因此不会执行 keycloak-stuff 并且会发生相应的授权)

详情:

1.自定义过滤器Class

public class CustomFilter extends OncePerRequestFilter {

  @Value("${securityEnabled}")
  private boolean securityEnabled;

  @Value("${grantedRoles}")
  private String[] grantedRoles;

  @Override
  public void doFilterInternal(HttpServletRequest req, HttpServletResponse res,
                       FilterChain chain) throws IOException, ServletException {

      if (!securityEnabled){
          // Read roles from application.yml
          Set<String> roles = Arrays.stream(grantedRoles)
                  .collect(Collectors.toCollection(HashSet::new));
          // Dummy Keycloak-Account
          RefreshableKeycloakSecurityContext session = new RefreshableKeycloakSecurityContext(null, null, null, null, null, null, null);
          final KeycloakPrincipal<RefreshableKeycloakSecurityContext> principal = new KeycloakPrincipal<>("Dummy_Principal", session);
          final KeycloakAccount account = new SimpleKeycloakAccount(principal, roles, principal.getKeycloakSecurityContext());
          // Dummy Security Context
          SecurityContext context = SecurityContextHolder.createEmptyContext();
          context.setAuthentication(new KeycloakAuthenticationToken(account, false));
          SecurityContextHolder.setContext(context);

          // Skip the rest of the filters
          req.getRequestDispatcher(req.getServletPath()).forward(req, res);
      }

      chain.doFilter(req, res);
  }
}


2.在Spring-Security

的http-Configuration中插入Custom-Filter
protected void configure(HttpSecurity http) throws Exception {
    super.configure(http);
    http
            .cors()
            .and()
            .csrf()
            .disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .sessionAuthenticationStrategy(sessionAuthenticationStrategy())
            .and()
            .addFilterAfter(CustomFilter(), CsrfFilter.class)
            .authorizeRequests()
            .anyRequest().permitAll();
}

配置Keycloak后查看默认的Filter-Chain:

Filter-Chain

所以很明显在位置 5 插入自定义过滤器以避免整个 Keycloak-Magic。

我已经使用这个解决方法来破坏方法安全性,它是@Secured-Annotation。

spring boot 2.5.6 和 keycloak 16.1.0 的更新答案

在您的 application.properties 中设置:

spring.autoconfigure.exclude=org.keycloak.adapters.springboot.KeycloakAutoConfiguration

(自动配置 class 名称自之前的答案以来已更改)

keycloak 适配器依赖项也引入了标准的 spring 安全自动配置,所以如果你想禁用两者,请使用这个:

spring.autoconfigure.exclude=org.keycloak.adapters.springboot.KeycloakAutoConfiguration,org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration