gpt4 book ai didi

spring - 带有 Spring Boot/Spring Security 的 Keycloak 细粒度权限

转载 作者:行者123 更新时间:2023-12-04 17:37:39 26 4
gpt4 key购买 nike

我想使用权限或范围或类似的内容来允许对 REST 资源的细粒度访问。

理想情况下,我想做类似的事情:

@PreAuthorize("hasPermission('Brands', 'brands:write')")
ResponseEntity<Brand> getBrand(@PathVariable("brandCode") String brandCode);

其中“Brands”是一个keycloak客户端授权资源,范围为“brands:write,brands:read”。

唯一似乎有效的注释是带有角色的 @Secured,我不想做 RBAC。
@Secured({"ROLE_STAFF"})

我已经查看了 PolicyEnforcer,但我不清楚它应该如何使用。

我可以编写以下形式的代码:
KeycloakSecurityContext keycloakSecurityContext = (KeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());
AuthorizationContext authzContext = keycloakSecurityContext.getAuthorizationContext();
if (authzContext.hasScopePermission("brands:write")) {

// This works....
}

如何将 PolicyEnforcing 中的 AuthorizationContext 绑定(bind)到标准 Spring 安全注释?

最佳答案

@Component
public class CustomPermissionEvaluator implements PermissionEvaluator {
@Autowired
private HttpServletRequest request;


@Override
public boolean hasPermission(Authentication auth, Object targetDomainObject, Object permission) {
if ((auth == null) || (targetDomainObject == null) || !(permission instanceof String)){
return false;
}

KeycloakSecurityContext keycloakSecurityContext = (KeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());
AuthorizationContext authzContext = keycloakSecurityContext.getAuthorizationContext();

if(targetDomainObject instanceof String) {
return authzContext.hasPermission((String)targetDomainObject, (String)permission);
} else if(targetDomainObject == null) {
return authzContext.hasScopePermission((String)permission);
} else {
return false;
}
}

关于spring - 带有 Spring Boot/Spring Security 的 Keycloak 细粒度权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56054718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com