使用 Quarkus 3 和 Primefaces 扩展来构建 JSF 应用程序。 Quarkus 已设置为使用基于表单的身份验证,并且根据对源代码的审查,FormAuthenticationMechanism 返回 UsernamePasswordAuthenticationRequest 和 TrustedAuthenticationRequest 的凭证类型,这两个都是我实现的。
不确定 TrustedAuthenticationRequest 应该如何工作。请求 Faces 页面时,TrustedAuthenticationRequest 的身份提供程序会被多次调用,似乎每个资源(css、js 等)调用一次。下面列出了身份提供商代码。每次调用时都会设置主体和角色,这似乎有点过分(一页导致超过 10 次调用)。
这是预期的行为还是我在这里实施了错误?
谢谢
@Override
public Uni<SecurityIdentity> authenticate(TrustedAuthenticationRequest request,
AuthenticationRequestContext authenticationRequestContext) {
if (Objects.nonNull(request.getPrincipal())) {
return Uni.createFrom().item(QuarkusSecurityIdentity.builder()
.setPrincipal(new QuarkusPrincipal(request.getPrincipal()))
.addRoles(Set.of("create", "read", "update", "delete"))
.build());
}
throw new AuthenticationFailedException("password invalid or user not found");
}
我想我找到了答案:
quarkus.http.auth.proactive=false
https://quarkus.io/guides/security-proactive-authentication
这回答了我关于多重身份验证的问题。我仍然不确定为什么表单有两种身份验证类型。我能想到的最接近的原因是它模仿了 Jakartaee 中 Soteria 安全性的 IdentityStore。通常有一个用于用户凭据的身份存储,以及一个用于角色的单独身份存储。那么也许这就是 Quarkus 正在做的事情?