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

3
我该如何在Spring Boot资源服务器中使用Keycloak授权服务?
我已经在Keycloak客户端中设置了仅限Bearer访问,可以使用其文档中的信息来保护资源路径。
但是当我的Bearer客户端设置为“启用授权”并且我设置了资源、策略和权限时,就不能进行保护。
根据Keycloak的文档,“如果你正在使用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无关。无论如何,您可以查看https://github.com/keycloak/keycloak-quickstarts/tree/master/app-authz-springboot。 - Sébastien Blanc
抱歉,我的问题有误,不是keycloak-test-helper,而是keycloak-authz-client。我会更新问题。 - Melissa
嗨,Sebastian,看起来那个演示是针对Keycloak版本3.2.0.CR1-SNAPSHOT的。我正在使用版本3.1.0.Final。我能否在3.1.0.Final上运行它,还是需要等待新版本的更改? - Melissa
是的,它应该可以与3.1.Final一起使用,只需确保在您的pom.xml中有“keycloak-authz-client”依赖项。 - Sébastien Blanc
我来晚了,这个问题解决了吗?如果没有,你能分享一下pom.xml和application.properties文件吗?我也遇到了这个问题,我的错误是同时进行了boot和spring-security配置。 - chiranjeevigk
2个回答

0

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


我已经尝试过加入了,但是仍然出现了错误,类似于“org.keycloak.authorization.client.util.HttpResponseException: Unexpected response from server: 400 / Bad Request]”。我知道 API 是可以工作的,因为在包含 Keycloak 授权服务之前已经进行了测试。对于一个纯资源服务器来说,使用 keycloak-authz-client 似乎是有问题的。我正忙着按照你发给我的快速入门指南进行操作。乍一看,它似乎是一个客户端 Web 应用程序的示例,而不是一个资源服务器。 - Melissa
资源服务器使用kc-authz-client并没有错,因为RS应该能够访问某些API以管理资源。 此外,使用UMA时还有一个用于获取权限票据的API。 快速入门基本上是客户端和RS。 - Sébastien Blanc
你好Sebastian,我已经成功将快速入门工作应用于3.1.0.Final版本。但是我无法保护我添加到ApplicationController的JSON响应: '@RequestMapping(value = "/protected/hello", method = RequestMethod.GET) public Map<String, String> hello() { return Collections.singletonMap("message", "hello"); }' 并且从pom.xml中删除了freemarker依赖项。 我还在keycloak中添加了一个资源(/protected/hello/*),并设置了/protected/premium/*的权限和策略。 URL http://localhost:8081/protected/hello/ 重定向到Keycloak登录页面,但使用jdoe/jdoe登录后出现404错误。 - Melissa
哦不,404错误是我的错!ApplicationController是一个控制器,而我需要一个RestController来获取JSON响应。 - Melissa
1
好的,我现在要用Auth Services保护JSON端点,问题是:1)为什么我仍然需要keycloak.securityConstraints [0]设置。这是否意味着我的所有用户都必须拥有用户角色?我的理解是所有的认证配置都可以在Keycloak中完成。我是否误解了这一点?2)我无法使用keycloak.bearer-only = true将访问类型设置为bearer-only,因为这会导致服务器返回Unexpected response from server: 400 / Bad Request,请帮助我理解。因为我想保护一个纯RS。再次感谢您的帮助。 - Melissa

0
  • 将keycloak.json添加到您的资源中(通常keycloak适配器会查找keycloak.json进行配置)

或者

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

    @Bean open fun keycloakConfigResolver(): KeycloakSpringBootConfigResolver { return KeycloakSpringBootConfigResolver() }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接