我有一个集成了keycloak的Spring Boot项目。现在我想禁用keycloak用于测试目的。
我尝试将keycloak.enabled=false
添加到application.properties
,如Keycloak documentation所述,但它没有用。
那么如何禁用它?
答案 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。