spring-boot - Keycloak springboot 适配器不允许设置 keycloak.policy-enforcer-config.user-managed-access 属性

标签 spring-boot oauth-2.0 authorization keycloak

我尝试使用 springboot 适配器保护我的应用程序。在深入研究源代码之后,我发现一些似乎是实现中的错误。

在 KeycloakAdapterPolicyEnforcer 类中,获取用户权限的方法 getPermissionTicket 包含:

private String getPermissionTicket(PathConfig pathConfig, PolicyEnforcerConfig.MethodConfig methodConfig, AuthzClient authzClient, OIDCHttpFacade httpFacade) {
    if (getEnforcerConfig().getUserManagedAccess() != null) {
        ProtectionResource protection = authzClient.protection();
        PermissionResource permission = protection.permission();
        PermissionRequest permissionRequest = new PermissionRequest();

        permissionRequest.setResourceId(pathConfig.getId());
        permissionRequest.setScopes(new HashSet<>(methodConfig.getScopes()));

        Map<String, List<String>> claims = resolveClaims(pathConfig, httpFacade);

        if (!claims.isEmpty()) {
            permissionRequest.setClaims(claims);
        }

        return permission.create(permissionRequest).getTicket();
    }

    return null;
}

getEnforcerConfig().getUserManagedAccess() != null 如果您没有在 application.properties 中定义 keycloak.policy-enforcer-config.user-managed-access 属性,则始终为 null。

但我无法定义它,因为 PolicyEnforcerConfig 类将字段 userManagedAccess 定义为 UserManagedAccessConfig 对象

@JsonProperty("user-managed-access")
@JsonInclude(JsonInclude.Include.NON_NULL)
private UserManagedAccessConfig userManagedAccess;

但没有提供任何 jackson 转换器来将 String 传递给 UserManagedAccessConfig

如果不设置此配置属性,适配器只会拒绝所有请求。此问题有任何解决方法吗?

最佳答案

是的,我只是使用一个 bean 而不是属性文件。像这样:

@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
@EnableTransactionManagement
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    @Primary
    public KeycloakSpringBootProperties properties() {
        final KeycloakSpringBootProperties props = new KeycloakSpringBootProperties();
        final PolicyEnforcerConfig policyEnforcerConfig = new PolicyEnforcerConfig();
        policyEnforcerConfig.setEnforcementMode(EnforcementMode.ENFORCING);
        policyEnforcerConfig.setUserManagedAccess(new UserManagedAccessConfig());
        props.setPolicyEnforcerConfig(policyEnforcerConfig);
        return props;
    }
}

关于spring-boot - Keycloak springboot 适配器不允许设置 keycloak.policy-enforcer-config.user-managed-access 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57609311/

相关文章:

c# - 如何保留 DotNetOpenAuth OAuth2 刷新和访问 token

django - 在不调用它们的情况下找到 Django URL 所需的权限?

java - 错误 : org. hibernate.MappingException : Could not determine type for: java. util.List

go - 从 OAuth 请求客户端获取 token

springdoc-openapi 在没有服务器的情况下生成 openapi yaml

android - oauth2 : Android authentication against spring boot

oauth - 为什么 OAuth2 授权代码授予流程中的授权请求不需要客户端 key ?

Swift 如何显示警报以请求照片库的权限?

jpa - Spring启动数据jpa多个数据源entityManagerFactory错误

spring-boot - Spring Boot 主作用域中的 cucumber : Autowire not working