【问题标题】:Quarkus: how to manage complex role relationships?Quarkus:如何管理复杂的角色关系?
【发布时间】:2021-01-10 05:09:48
【问题描述】:

我们的团队目前正在开发我们的第一个 Quarkus 应用程序,大多数开发人员主要对 Spring 生态系统有经验。我们面临以下授权相关问题:

我们的用户通过 openID 和 JWT 使用公司提供的 SSO 解决方案进行身份验证,其中一些默认角色已经给出。我们有一些特殊的领域特定规则,例如如果用户至少有一个角色 [A, B, C],他就隐含地获得角色 Z(原则上类似于复合角色)。角色“Z”不是来自 JWT 令牌。然后资源端点中的授权应该起作用,例如@RolesAllowed("A")@RolesAllowed("Z")

您将如何在 Quarkus 中实现这一点?

【问题讨论】:

    标签: jax-rs resteasy quarkus rbac microprofile


    【解决方案1】:

    您可以实现SecurityIdentityAugmentor 来修改SecurityIdentity。一个将实现您的规则“如果身份具有至少一个角色 [A, B, C],那么它也具有角色 Z”的规则如下所示:

    @Singleton
    public class MyRolesAugmentor implements SecurityIdentityAugmentor {
        @Override
        public int priority() {
            return 0;
        }
    
        @Override
        public Uni<SecurityIdentity> augment(SecurityIdentity identity, AuthenticationRequestContext context) {
            return Uni.createFrom().item(() -> {
                QuarkusSecurityIdentity.Builder builder = QuarkusSecurityIdentity.builder(identity);
                if (identity.hasRole("A") || identity.hasRole("B") || identity.hasRole("C")) {
                    builder.addRole("Z");
                }
                return builder.build();
            });
        }
    }
    

    【讨论】:

    • 这确实有效。但我对这样的解决方案有点惊讶。我认为 Quarkus 就是使用标准的 Jakarta EE 东西。这个解决方案似乎非常特定于 Quarkus。没有标准吗?而且这似乎是一个常见的用例,我们真的需要自己构建吗?例如 Spring Security 已经内置了这个。
    猜你喜欢
    • 2018-08-23
    • 2021-10-07
    • 2010-10-10
    • 2010-09-22
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多