JSF Tomcat, управляемая контейнером, аутентификация плюс дополнительная кнопка входа
В настоящее время я расширяю свой сайт JSF. Я использую механизм управляемой проверки подлинности контейнера Tomcat (работает хорошо, пользователь вынужден войти в систему, прежде чем получить доступ к защищенной области), и теперь я хочу предоставить дополнительную кнопку входа в систему.
С помощью кнопки входа я хочу, чтобы пользователь получил учетные данные "LOGGED_IN_CUST" для того, чтобы веб-сайт предоставлял дополнительные функции (например, изменение / добавление / удаление адресов) до перехода на защищенную страницу, например orderProducts.xhtml.
Пример:
Текущий сайт: index.xhtml
Если я нажму на ссылку входа в систему в правом верхнем углу, откроется страница login.xhtml:
<form action="j_security_check">
<h:panelGrid columns="2" bgcolor="#eff5fa" cellspacing="5"
frame="box" styleClass="center">
<h:outputLabel value="User name:" />
<h:inputText id="j_username" tabindex="1" />
<h:outputLabel value="Password:" />
<h:inputSecret id="j_password" />
<h:outputLabel value="" />
<h:commandButton id="login" value="Login" />
</h:panelGrid>
</form>
После использования правильных учетных данных пользователя и нажатия кнопки входа в систему я получаю следующую ошибку:
HTTP Status 400 - Invalid direct reference to form login page
message: Invalid direct reference to form login page
description: The request sent by the client was syntactically incorrect.
Есть ли решение для входа с помощью дополнительной ссылки для входа. И после того, как клиент успешно вошел в систему, сайт, который был показан ранее, снова активен? (В этом примере index.xhtml)
1 ответ
Я перестроил приложение. Вместо формы входа с атрибутом действия "j_security_check"
Я создал обычный commandButton
который вызывает следующий метод doLogin
public void doLogin(ActionEvent e) throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) context
.getExternalContext().getRequest();
try {
// Try to login customer via container management
request.login(eMail, password);
/*
* In case that the Login link was clicked, then the variable
* "requestedURI" is null ! In that case we can redirect the
* customer directly to his customerOverview site. A user with role
* ADMIN will be redirected to systemInfo.xhtml and a user with role
* CUST is redirected to customerOverview.xhtml.
*/
if(requestedURI == null){
if(request.isUserInRole(ROLE_ADMIN)){
requestedURI = BASE_NAME+"/faces/sections/admin/systemInfo.xhtml";
}
else if(request.isUserInRole(ROLE_CUST)){
requestedURI = BASE_NAME+"/faces/sections/customer/customerOverview.xhtml";
}
else{
requestedURI = BASE_URL;
}
}
/*
* If everything worked well, redirect the customer to the desired
* page
*/
context.getExternalContext().redirect(requestedURI);
} catch (ServletException se) {
context.addMessage(null, new FacesMessage(Internationalization.getLoginFailed()));
}
}
Это решение прекрасно работает для меня:)