Quarkus和Keycloak:评估基于范围的权限

时间:2019-12-18 13:37:01

标签: java keycloak quarkus

我有一个REST API,应该使用Keycloak来授权传入的请求。我在API中配置所需的范围时遇到问题。
在Keycloak中,我为我的API定义了一个客户端,一个调用服务的客户端和两个用户。两个用户都有一些领域角色。我的API的客户端定义了资源,一些范围(例如,读取,删除),策略和权限。 一种权限允许具有管理员角色的用户对资源执行范围读取和删除。另一个允许具有监视角色的用户读取资源。
我知道将对照Keycloak客户端资源中定义的路径检查端点的路径。

我在这里的具体问题是我不知道如何告诉端点他需要哪个范围。

最后,我希望有多个端点具有相同的路径但作用域不同(对于每个HTTP方法)。

这是我的示例配置:

quarkus.http.port=8080
quarkus.resteasy.path=/api
quarkus.oidc.auth-server-url=https://myUrl:8443/auth/realms/enaq
quarkus.oidc.client-id=rest-api
quarkus.oidc.credentials.secret=secret-string
quarkus.oidc.enabled=true
quarkus.application.name=keycloak-test-api
quarkus.application.version=0.0.1
quarkus.keycloak.policy-enforcer.enable=true

这是一个示例实现:

@Path("/measurements")
public class MeasurementResource {

    @Autowired
    MeasurementService delegate;

    @GET
    @Path("/{id}/{from}/{to}/{resolution}")
    @Produces(MediaType.APPLICATION_JSON)
    public MeasurementHistory getMeasurementHistory(@PathParam("id") String deviceId, @PathParam("from") Long from,
            @PathParam("to") Long to, @PathParam("resolution") Integer resolution) {
        return delegate.getMeasurementHistory(from, to, resolution, deviceId);
    }
}

在我的示例中,将评估我的权限,但只有管理员可以访问。监视用户将被拒绝,尽管他应该能够阅读。

1 个答案:

答案 0 :(得分:1)

为了定义应该保护的确切范围并将它们映射到适当的HTTP动词,您应该按照记录的here配置策略执行器。

在Quarkus上还没有文档显示如何将其映射到属性(application.properties),但是这样做很简单。您可以从here获取示例。

另一个选择是设置quarkus.keycloak.policy-enforcer.http-method-as-scope=true。这样,您的资源将与诸如GETPOSTDELETE等范围相关联。策略执行者将相应地强制执行访问,而不会强制您在配置中映射路径文件。