Quarkus:如何管理复杂的角色关系?

问题描述

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

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

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

解决方法

您可以实现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();
        });
    }
}