Spring Boot - 如何禁用Keycloak?

时间:2017-12-18 02:45:52

标签: spring spring-boot keycloak

我有一个集成了keycloak的Spring Boot项目。现在我想禁用keycloak用于测试目的。

我尝试将keycloak.enabled=false添加到application.properties,如Keycloak documentation所述,但它没有用。

那么如何禁用它?

4 个答案:

答案 0 :(得分:2)

它应该有用,但根据对此jira ticket的最后评论,似乎不是。

作为说明状态,您可以排除添加到application.properties的密钥泄露的弹簧启动自动配置:spring.autoconfigure.exclude=org.keycloak.adapters.springboot.KeycloakSpringBootConfiguration

答案 1 :(得分:2)

对于任何可能遇到相同麻烦的人,这就是我所做的。

我没有禁用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,因为应用程序中的某些审核功能依赖于它。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我的解决方法:

1.创建一个自定义过滤器,并将其添加到早期的(春季)安全链中。
2.在application.yml(securityEnabled)中创建一个标志
3.在自定义过滤器中查询标志。如果为“ true”,则只需通过调用chain.doFilter()继续进行下一个过滤器。如果为“ false”,则创建一个虚拟Keycloak-Account来设置所需的角色并将其设置为上下文。
4.顺便说一下,角色也外包给了application.yml
5.跳过安全链中的其余过滤器(这样就不会执行任何密钥斗篷工作,并且不会发生相应的授权)

详细说明:

1.自定义过滤器的类别

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

因此很明显,将Custom-Filter插入位置5可以避免整个Keycloak-Magic。

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