问题描述
我们的团队目前正在开发我们的第一个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();
});
}
}