gpt4 book ai didi

java - OAuth2 客户端凭据通过 Spring Boot Keycloak 集成流

转载 作者:搜寻专家 更新时间:2023-10-31 19:42:48 24 4
gpt4 key购买 nike

我的申请包括:

  • 后端/资源服务器
  • 用户界面网络应用
  • key 斗篷

UI 正在通过 RESTful API 使用具有授权代码授予流程的 keycloak 客户端与后端服务器通信。这工作正常。

现在,我需要使用系统/服务帐户(通常具有比用户更多的权限)访问后端资源的额外可能性。你会如何实现这个要求?我认为客户端凭据流在这里很有用。

是否可以将 OAuth2 客户端凭证流与 Spring Boot 的 keycloak 客户端一起使用?我找到了使用 Spring Security OAuth2 客户端功能实现客户端凭据流的示例,但这感觉很奇怪,因为我已经将 keycloak 客户端用于 OAuth。

编辑:解

感谢您的回答,对我帮助很大。在我的 UI webapp 中,我现在可以通过使用经过身份验证的用户 OAuth2 token 或使用来 self 的 UI 服务帐户的客户端凭据流的 token 与后端通信。每种方式都有自己的 RestTemplate,第一种方式通过 keycloak 集成完成,第二种方式由 Spring Security OAuth2 完成,如 here 所述。 .

最佳答案

是的,您可以使用 OAuth 2.0 客户端凭证流和服务帐户。

Keycloak 提出了 3 种保护 SpringBoot REST 服务的方法:

  1. 使用 Keycloak Spring Boot 适配器
  2. 使用 keycloak Spring Security Adapter
  3. 使用 OAuth2/OpenID Connect

这里用 OAuth2/OIDC 方式的例子对此进行了很好的解释:

如果你按照这个例子,请记住:

注意将您的客户端配置为:

  • 访问类型: secret
  • 授权:已启用
  • 服务帐户(OAuth 客户端凭据流):已启用

注意将目标服务配置为:

  • 访问类型:仅承载

因此,调用方应该是 secret ,目标服务应该是bearer-only

创建您的用户、角色、映射器...并为您的用户分配角色。

检查你的 spring 项目中是否有这个依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
</dependency>

配置要在 REST 客户端中使用的身份验证(application.properties)例如:

security.oauth2.client.client-id=employee-service
security.oauth2.client.client-secret=68977d81-c59b-49aa-aada-58da9a43a850
security.oauth2.client.user-authorization-uri=${rest.security.issuer-uri}/protocol/openid-connect/auth
security.oauth2.client.access-token-uri=${rest.security.issuer-uri}/protocol/openid-connect/token
security.oauth2.client.scope=openid
security.oauth2.client.grant-type=client_credentials

像 Arun 的示例一样实现您的 JwtAccessTokenCustomizerSecurityConfigurer (ResourceServerConfigurerAdapter)。

最后实现你的服务 Controller :

@RestController
@RequestMapping("/api/v1/employees")
public class EmployeeRestController {

@GetMapping(path = "/username")
@PreAuthorize("hasAnyAuthority('ROLE_USER')")
public ResponseEntity<String> getAuthorizedUserName() {
return ResponseEntity.ok(SecurityContextUtils.getUserName());
}

@GetMapping(path = "/roles")
@PreAuthorize("hasAnyAuthority('ROLE_USER')")
public ResponseEntity<Set<String>> getAuthorizedUserRoles() {
return ResponseEntity.ok(SecurityContextUtils.getUserRoles());
}
}

如需完整教程,请阅读引用的 Arun 教程。

希望对您有所帮助。

关于java - OAuth2 客户端凭据通过 Spring Boot Keycloak 集成流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57974630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com