java - 如何使用 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 权限?
解决方案
解决方案是将 .findByName() 替换为 .findByUri()。此端点不考虑资源的所有者。我创建了一个要点以防其他人可能需要它:ResourceAccessKeycloakWebFilter
推荐阅读
- angular - 防止在 Angular 中打开新选项卡
- java - 将 JNOSQL(CDI 库)与 Spring Boot 一起使用 - 找不到 Bean
- java - 1 个 EditText 的 2 个 TextWatchers
- r - 使用 Rcurl 从网站逐页解析
- django - Django AssertRedirects 抛出断言错误 301 != 302
- r - ggplot2中的条形图以显示每个条形和c中的总数百分比
- arrays - VBA中的复选框FOR循环数组
- git - 如何检查自上次在 git 的主分支中提交以来文件夹或子文件夹是否已被修改?
- javascript - 如何将图像用作另一个图像的按钮
- html - TTF 字体文件可在 Chrome 上运行,但在尝试下载时已损坏