我正在尝试将 java-ee-kickoff-app (https://github.com/javaeekickoff/java-ee-kickoff-app) 与 openid 一起使用。 我正在使用 keycloak 26.0.5 和 wildfly 29.0.1.Final (integrated-jaspi 是 false)。
我与用户([电子邮件受保护])和客户端创建了我的领域。
然后我设置参数:
@OpenIdAuthenticationMechanismDefinition(
clientId = "java-ee-kickoff-app"
, clientSecret = "Bv2c31PFMU1G2jvtGdsM1ojfH0eeoefv"
, providerURI = "http://localhost:8180/realms/java-ee-kickoff-app"
, redirectToOriginalResource = true
)
@ApplicationScoped
public class KickoffFormAuthenticationMechanism {
}
我删除了原来的 KickoffIdentityStore
我还创建了一个组 IdentityStore :
@ApplicationScoped
public class KickoffGroupIdentityStore implements IdentityStore {
@Inject
private PersonService personService;
@Override
public Set<ValidationType> validationTypes() {
return EnumSet.of(ValidationType.PROVIDE_GROUPS);
}
@Override
public Set<String> getCallerGroups(CredentialValidationResult validationResult) {
String name = validationResult.getCallerPrincipal().getName();
Person person = personService.getByEmail(name);
return person.getRolesAsStrings();
}
}
访问 http://localhost:8080/java-ee-kickoff-app/admin/users 会触发 keycloak 登录页面。我输入管理员用户的凭据。
不幸的是我得到:
Caused by: java.io.IOException: ELY01177: Authorization failed.
at [email protected]//org.wildfly.security.auth.jaspi.impl.JaspiAuthenticationContext$1.handleOne(JaspiAuthenticationContext.java:261)
当我调试应用程序时,我可以看到找到了组。 另外
org.glassfish.soteria.cdi.DefaultIdentityStoreHandler
返回一个带有正确名称和组的良好 CredentialValidationResult。
问题:
securityContext.getCallerPrincipal().getName()
是“匿名”。
那么为什么我会遇到身份验证失败以及为什么我的委托人是“匿名”?
我从我的
web.xml
中删除了这部分:
<login-config>
<auth-method>OIDC</auth-method>
</login-config>
因此,如果您使用@OpenIdAuthenticationMechanismDefinition
,请不要在您中添加身份验证方法OIDC
web.xml