首页 > 解决方案 > 如何使用 Keycloak authzClient 评估权限?

问题描述

我在 Keycloak 上有一个受保护的资源,使用以下代码通过远程 API 创建:

    private fun ProtectedEntity.protect(location: URI, principal: Principal) {
        val newResource = ResourceRepresentation()
        newResource.name = this.id
        newResource.displayName = this.name
        newResource.type = "urn:$appName:resources:${this.javaClass.simpleName.toLowerCase().replace("entity", "")}"
        newResource.owner = ResourceOwnerRepresentation(this.creator)
        newResource.ownerManagedAccess = true
        newResource.uris = setOf(location.path.toString())
        authzClient.protection().resource().create(newResource)
    }

资源所有者是调用该方法的用户,他可以管理自己的资源。

现在我必须检查用户是否有权访问资源,如果没有,我想我应该返回一张票,以防用户请求访问资源。我试过了,但 authorize() 抛出“创建权限票时出错”。

override fun read(id: ID, principal: Principal): Mono<ResponseEntity<E>> {
        val currentUserToken = principal!!.getCurrentUserToken()
        val resource = authzClient.protection().resource().findByName(id.toString(), currentUserToken.getUsername())
        val token = currentUserToken.tokenValue
        val request = AuthorizationRequest()
        request.addPermission(resource.id)
        request.setRpt(token)

        // This returns Error creating permission ticket !?
        val response = authzClient.authorization().authorize(request)
        val result = authzClient.protection().introspectRequestingPartyToken(response.token)
        println(result.active)
        if (result.active) {
           return super.read(id, principal)
        } else throw RuntimeException("Result token RPT is not active!")
}

我将如何委托使用 authzClient 评估 Keycloak 权限?

标签: javakeycloak

解决方案


解决方案是将 .findByName() 替换为 .findByUri()。此端点不考虑资源的所有者。我创建了一个要点以防其他人可能需要它:ResourceAccessKeycloakWebFilter


推荐阅读