Я пытаюсь настроить аутентификацию на основе форм для своего приложения JSF в Wildfly 39 и нашел следующие источники:
https://rieckpil.de/howto-simple-form-b ... urity-api/
https://www.baeldung.com/java-ee-8-security
Я пытаюсь реализовать подход IdentityStore в коде и настроить @CustomFormAuthenticationMechanismDefinition с помощью моей формы JSF, вызывающей securityContext.authenticate(...), следуя руководству rieckpil.
Я пытался настроить Подсистема Undertow согласно документации:
standalone.xml
И укажите его в jboss-wex.xml:
/
other
Я реализовал специальную реализацию CallerPrincipal, которая хранит мои пользовательские данные, и я ожидаю этого от SecurityContext, но на самом деле произошло следующее:
Каждый раз, когда я пытаюсь войти в систему в первый раз после запуска приложения, оно каждый раз возвращает статус SEND_CONTINUE, даже если это не удается. Однако в случае сбоя сервер защищает ресурсы /app/* и разрешает доступ только тогда, когда я вхожу в систему с действительными входными данными.
Только после того, как я выхожу из системы и снова пытаюсь выполнить те же действия, он возвращает SUCESS или SEND_FAILURE.
Ожидается ли это? Есть ли нюансы, которые я до сих пор игнорировал?
Вот код:
(...)
// LoginBean
@Named
@RequestScoped
public class LoginBean {
@Inject
SecurityContext securityContext;
@Inject
FacesContext facesContext;
private String username; // getter setter
private String password; // getter setter
public void login() {
var status = securityContext.authenticate(
JsfUtil.request(),
JsfUtil.response(),
AuthenticationParameters.withParams().credential(
new UsernamePasswordCredential(username, password)
)
);
if (status == SEND_CONTINUE) {
facesContext.responseComplete();
} else if (status == SUCCESS) {
JsfUtil.redirect("app/home.xhtml");
} else if (status == SEND_FAILURE) {
errorMessage("Login failed", "Invalid credentials");
}
}
}
//IdentityStore
@ApplicationScoped
public class UserIdentityStore implements IdentityStore {
@EJB
UserService userService;
@Override
public CredentialValidationResult validate(Credential credential) {
if (credential instanceof UsernamePasswordCredential upc) {
var u = userService.findUserLogin(upc.getCaller(), upc.getPasswordAsString());
if (u != null) {
return new CredentialValidationResult(new UserCallerPrincipal(u), Set.of("USER"));
}
return CredentialValidationResult.INVALID_RESULT;
}
return CredentialValidationResult.NOT_VALIDATED_RESULT;
}
}
web.xml
App
/app/*
USER
USER
Подробнее здесь: https://stackoverflow.com/questions/798 ... entication