将 Keycloak 授权服务与 Spring Boot(资源服务器)一起使用

Posted

技术标签:

【中文标题】将 Keycloak 授权服务与 Spring Boot(资源服务器)一起使用【英文标题】:Use Keycloak Authorization Services with Spring Boot (resource server) 【发布时间】:2017-11-13 13:54:38 【问题描述】:

如何将 Keycloak 授权服务与 Spring Boot 资源服务器一起使用?

我有一个 keycloak 中的客户端设置为仅承载,并且可以使用其文档中的信息保护资源路径。

但当我的仅承载客户端的“授权已启用”设置为 true 并且我已设置资源、策略和权限时,则不会。

来自 Keycloak 文档https://keycloak.gitbooks.io/documentation/authorization_services/topics/enforcer/keycloak-enforcement-filter.html “如果您使用 Keycloak OIDC 适配器,您可以为您的应用程序强制执行授权决策。 当您为 Keycloak 应用程序启用策略执行时,相应的适配器会拦截对您的应用程序的所有请求并执行从服务器获得的授权决策。”

在 application.properties 我设置: keycloak.policy-enforcer-config.enforcement-mode=enforcing

并得到错误:

java.lang.NoClassDefFoundError: org.keycloak.authorization.client.ClientAuthenticator

我添加了依赖

<dependency> <!-- https://issues.jboss.org/browse/KEYCLOAK-3246 -->
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-authz-client</artifactId>
        <version>3.1.0.Final</version>
    </dependency>

但这在尝试访问资源时会出现如下错误

Client 'resourceserver-springboot' doesn't have secret available
org.keycloak.authorization.client.util.HttpResponseException: Unexpected response from server: 400 / Bad Request

【问题讨论】:

为什么要添加 keycloak-test-helper 依赖?这与 authz 无关。无论如何,你可以看看github.com/keycloak/keycloak-quickstarts/tree/master/… 对不起,我的问题不是 keycloak-test-helper,而是 keycloak-authz-client 我会更新问题。 嗨 Sebastian,看起来该演示适用于 Keycloak 版本 3.2.0.CR1-SNAPSHOT。我使用的是 3.1.0.Final 版本。我可以在 3.1.0.Final 上运行它还是需要等待新版本的更改? 是的,它应该与 3.1 一起使用。Final 只需在您的 pom.xml 中添加 keycloak-authz-client 依赖项。 我来晚了。如果不能,这个问题解决了吗?你能分享 pom.xml 和 application.properties 文件吗?即使我得到这个我的错误是同时进行启动和弹簧安全配置。 【参考方案1】:

看起来您忘记在配置中传递秘密: keycloak.credentials.secret=my_secret

【讨论】:

我有,但是即使添加了它,我仍然会收到错误,类似于“org.keycloak.authorization.client.util.HttpResponseException: Unexpected response from server: 400 / Bad Request]”在包含 Keycloak 授权服务之前,我确实知道 API 的工作原理是经过测试的。将 keycloak-authz-client 用于纯资源服务器似乎是错误的。忙于完成您发送给我的快速入门。乍一看,这似乎是客户端 Web 应用程序的示例,而不是资源服务器。 Resource Server 使用 kc-authz-client 并没有错。原因是 RS 应该能够访问一些 API 以管理资源。此外,在使用 UMA 时,还有一个用于获取权限票证的 API。快速入门基本上既是客户端又是 RS。 嗨塞巴斯蒂安,我已经为 3.1.0.Final 工作了快速入门。但无法保护我添加到 ApplicationController 的 JSON 响应:'@RequestMapping(value = "/protected/hello", method = RequestMethod.GET) public Map hello() return Collections.singletonMap("message", “你好”); ' 并从 pom.xml 中删除了 freemarker 依赖项。我还在 keycloak 中添加了一个资源 (/protected/hello/*),其权限和策略设置为 /protected/premium/* URL localhost:8081/protected/hello 重定向以登录 Keycloak,因为 jdoe/jdoe 我收到 404 错误 哦不,404错误是我的错! ApplicationController 是一个控制器,因为我需要一个用于 JSON 响应的 RestController。 好的,我现在要使用身份验证服务保护 JSON 端点,问题:1) 为什么我仍然需要 keycloak.securityConstraints[0] 设置。这是否意味着我的所有用户都必须具有用户角色?我的理解是现在所有的身份验证配置都可以在 Keycloak 中完成。我误解了这个吗? 2)我无法使用 keycloak.bearer-only=true 将访问类型设置为仅承载,因为这会导致服务器的意外响应:400 / 来自的错误请求:似乎使用身份验证服务访问类型必须保密,请帮助我理解.因为我想保护一个纯粹的RS。再次提前感谢【参考方案2】: 将 keycloak.json 添加到您的资源中,(通常 keycloak 适配器看起来 用于配置的 keycloak.json)

将配置添加到您的 application.properties 文件中。 还要创建一个 bean 来解析您的 application.properties 钥匙斗篷适配器

@豆 打开有趣的 keycloakConfigResolver(): KeycloakSpringBootConfigResolver 返回 KeycloakSpringBootConfigResolver()

【讨论】:

以上是关于将 Keycloak 授权服务与 Spring Boot(资源服务器)一起使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Keycloak 进行微服务身份验证

Keycloak 授权 - 最佳实践角色与组

如何在 .html 文件中使用 Keycloak 将 thymleaf 与 Spring Security 一起使用?

Spring Boot - 无法通过 Zuul 代理获得 Keycloak 授权 api 的响应

Spring OAuth2 使用 Keycloak 自动登录

Spring应用程序基本身份验证通过keycloak