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
我有一个 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
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