【问题标题】:Keycloak springboot adapter does not allowed to set keycloak.policy-enforcer-config.user-managed-access propertyKeycloak springboot 适配器不允许设置 keycloak.policy-enforcer-config.user-managed-access 属性
【发布时间】:2019-12-27 18:38:14
【问题描述】:

我尝试使用 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;
}

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

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

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

但不提供任何杰克逊转换器从 String 传递到 UserManagedAccessConfig

如果没有设置这个配置属性,适配器只会拒绝每个请求。这个问题有什么解决方法吗?

【问题讨论】:

  • 你有没有想过这个问题?我有同样的问题

标签: spring-boot oauth-2.0 authorization keycloak


【解决方案1】:

是的,我只是使用 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;
    }
}

【讨论】:

    【解决方案2】:

    @scandinave 的答案不支持在应用程序属性中定义的keycloak.policy-enforcer-config.* 属性。正如discussion 中所建议的那样,有一个“肮脏”的解决方法如下,它可以保留策略执行器配置属性并只需添加 UserManagedAccessConfig 对象。

    public class KeycloakUMAConfigResolver extends KeycloakSpringBootConfigResolver {
    
        public KeycloakUMAConfigResolver() throws Exception {
        }
    
        public void configureUMAConfig() {
            try {
                Field f = KeycloakSpringBootConfigResolver.class.getDeclaredField("adapterConfig");
                f.setAccessible(true);
                KeycloakSpringBootProperties properties = (KeycloakSpringBootProperties) f.get(this);
    
                properties.getPolicyEnforcerConfig()
                        .setUserManagedAccess(new PolicyEnforcerConfig.UserManagedAccessConfig());
            } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    
    }
    

    然后在安全配置中创建这个配置解析器 bean。

        @Bean
        public KeycloakSpringBootConfigResolver KeycloakConfigResolver() throws Exception {
            return new KeycloakUMAConfigResolver();
        }
    
        @Bean
        @Qualifier("dummy bean")
        public Object dummyBeam(KeycloakUMAConfigResolver configResolver) {
            configResolver.configureUMAConfig();
            return new Object();
        }
    
    

    注意:尝试在构造函数中设置 UserManagedAccessConfig 失败,因为在构造函数中的对象初始化期间适配器配置字段不可用。因此使用了一个虚拟 bean 定义,然后调用了configureUMAConfig 方法。

    【讨论】:

    • 请问user-managed-access有什么用?我真的很想知道
    猜你喜欢
    • 2020-02-10
    • 1970-01-01
    • 2019-05-28
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多