在 Spring Boot 中禁用 Keycloak 安全性
一、概述
Keycloak 是一個免費和開源的身份和訪問管理程序,目前經常在我們的軟件堆棧中使用。在測試階段,禁用它以專注於業務測試可能很有用。我們的測試環境中也可能沒有 Keycloak 服務器。
在本教程中,我們將禁用 Keycloak starter 的配置。我們還將研究在我們的項目中啟用 Spring Security 時修改它。
2. 在非 Spring-Security 環境中禁用 Keycloak
我們將首先了解如何在不使用 Spring Security 的應用程序中禁用 Keycloak。
2.1。應用程序設置
讓我們首先將[keycloak-spring-boot-starter](https://search.maven.org/search?q=keycloak-spring-boot-starter)
依賴項添加到我們的項目中:
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-starter</artifactId>
</dependency>
另外,我們需要添加[keycloak-adapter-bom](https://search.maven.org/search?q=keycloak-adapter-bom)
依賴帶來的各種嵌入式容器的依賴:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak.bom</groupId>
<artifactId>keycloak-adapter-bom</artifactId>
<version>15.0.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
接下來,我們將向我們的application.properties
添加 Keycloak 服務器的配置:
keycloak.auth-server-url=http://localhost:8180/auth
keycloak.realm=SpringBootKeycloak
keycloak.resource=login-app
keycloak.public-client=true
keycloak.security-constraints[0].authRoles[0]=user
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/users/*
此配置確保對/users
URL 的請求只能由具有user
角色的經過身份驗證的用戶訪問。
最後,讓我們添加一個檢索User
的UserController
:
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{userId}")
public User getCustomer(@PathVariable Long userId) {
return new User(userId, "John", "Doe");
}
}
2.2.禁用密鑰斗篷
現在我們的應用程序已經就緒,讓我們編寫一個簡單的測試來獲取用戶:
@Test
public void givenUnauthenticated_whenGettingUser_shouldReturnUser() {
ResponseEntity<User> responseEntity = restTemplate.getForEntity("/users/1", User.class);
assertEquals(HttpStatus.SC_OK, responseEntity.getStatusCodeValue());
assertNotNull(responseEntity.getBody()
.getFirstname());
}
此測試將失敗,因為我們沒有為restTemplate
提供任何身份驗證,或者因為 Keycloak 服務器不可用。
Keycloak 適配器實現了 Keycloak 安全性的Spring 自動配置。自動配置依賴於類路徑中存在的類或屬性的值。具體來說, @ConditionalOnProperty
註釋對於這種特殊需求非常方便。
要禁用 Keycloak 安全性,我們需要通知適配器它不應該加載相應的配置。我們可以通過如下分配屬性來做到這一點:
keycloak.enabled=false
如果我們再次啟動我們的測試,它現在將成功而不涉及任何身份驗證。
3. 在 Spring 安全環境中禁用 Keycloak
我們經常將 Keycloak 與 Spring Security 結合使用。在這種情況下,僅禁用 Keycloak 配置是不夠的,我們還需要修改 Spring Security 配置以允許匿名請求到達控制器。
3.1。應用程序設置
讓我們首先將spring-boot-starter-security依賴項添加到我們的項目中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
接下來,我們實現WebSecurityConfigurerAdapter
來定義 Spring Security 所需的配置。 Keycloak 適配器為此提供了一個抽像類和註釋:
@KeycloakConfiguration
public class KeycloakSecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
auth.authenticationProvider(keycloakAuthenticationProvider());
}
@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new NullAuthenticatedSessionStrategy();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.csrf()
.disable()
.authorizeRequests()
.anyRequest()
.authenticated();
}
}
在這裡,我們將 Spring Security 配置為僅允許來自經過身份驗證的用戶的請求。
3.2.禁用密鑰斗篷
除了像之前那樣禁用 Keycloak 之外,我們現在還需要禁用 Spring Security 。
我們可以使用配置文件告訴 Spring 在我們的測試期間是否激活 Keycloak 配置:
@KeycloakConfiguration
@Profile("tests")
public class KeycloakSecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
// ...
}
然而,更優雅的方式是重用keycloak.enable
屬性,類似於 Keycloak 適配器:
@KeycloakConfiguration
@ConditionalOnProperty(name = "keycloak.enabled", havingValue = "true", matchIfMissing = true)
public class KeycloakSecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
// ...
}
因此,Spring 僅在keycloak.enable
屬性為true
時才啟用 Keycloak 配置。如果該屬性丟失, matchIfMissing
默認啟用它。
當我們使用 Spring Security 啟動器時,禁用我們的 Spring Security 配置是不夠的。實際上,遵循 Spring 自以為是的默認配置原則,啟動器將創建一個默認安全層。
讓我們創建一個配置類來禁用它:
@Configuration
@ConditionalOnProperty(name = "keycloak.enabled", havingValue = "false")
public class DisableSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
http.csrf()
.disable()
.authorizeRequests()
.anyRequest()
.permitAll();
}
}
我們仍在使用我們的keycloak.enable
屬性,但這次Spring 啟用配置,如果其值設置為false
。
4。結論
在本文中,我們研究瞭如何在 Spring 環境中禁用 Keycloak 安全性,無論是否使用 Spring Security。
像往常一樣,本文中使用的所有代碼示例都可以 在 GitHub 上找到。