Выйдите из JSF, используя SSL в Glassfish 3 - PullRequest
1 голос
/ 08 апреля 2011

Я не нашел реального решения этой проблемы, даже когда оно действительно распространено ...

У меня есть такой контекст:

  • Приложение JSF, работающее на Glassfish Server v3.1, JDK6.Все на моем персональном компьютере с WinVista (последнее не должно быть важно).
  • Использование SSL и обычной проверки подлинности (безопасность контейнера)
  • Я сделал свой метод logout () в моей поддержкеbean-компонент делает недействительным сеанс и отправляет перенаправление.

Я не могу заставить контейнер снова показывать окно входа в систему для проверки пользователя и возможности смены пользователя ... И мой пользователь всегда может пойтиназад, нажав кнопку НАЗАД в браузере или просто записав URL, и продолжайте выполнять там операции, когда предполагается, что существующего сеанса не должно быть.

Я получаю имя пользователя в качестве моего компонента поддержкисоздано:

private void setName() {
    this.name = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName();

}

И я использую это имя для выполнения операций ...

Затем для выхода из моего xhtml есть код:

        <h:panelGroup id="logOut">
        <h:form>
            <h:commandLink id="linkLogOut" action="#{visitor.logout}" value="  Clic here to Log Out" />
        </h:form>
    </h:panelGroup>

Это вызывает этометод в моем bean-компоненте ::

public void logout() throws IOException {
   // FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    this.name = null;
    FacesContext fc = FacesContext.getCurrentInstance();
    HttpSession session = (HttpSession)fc.getExternalContext().getSession(false);
    session.invalidate();
FacesContext.getCurrentInstance().getExternalContext().redirect("https://localhost:8080/");
}

Я объявляю свой компонент поддержки с помощью:

@Named(value="visitor")
@SessionScoped

... Также я выполнял перенаправление из дескриптора развертывания ... иэто было то же самое.

Если я закрою браузер, сеанс будет потерян, и контейнер снова запросит у меня имя пользователя / пароль.

Есть предложения?

Большое спасибо!

Alejandro.

Ответы [ 2 ]

0 голосов
/ 18 мая 2011

Большое спасибо за все ваши ответы.

Я взял несколько выходных ... и не отвечал на эту тему.

Я просто хочу поделиться своим решением.

Обычная аутентификация привязана к браузеру, и после того, как вы выполнили вход, следует закрыть браузер, чтобы завершить выход из системы ... что не так элегантно.

Я перешел на аутентификацию FORM, создал свою форму и разместил информацию о пользователе в сервлете, который проверяет учетные данные пользователя в моей области, и этот сервлет перенаправил пользователя либо в приложение, либо на страницу с ошибкой. Очевидно, что должна быть сделана правильная конфигурация для ограничения безопасности в web.xml.

Я делюсь своим решением здесь:

Страница входа:

<!-- This is the login page that implement the "Form Base" login -->
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html">
<h:head>
    <title>Login Form</title>
</h:head>
<h:body>
    <h2>Welcome to the secure messaging service!:</h2>
    <form name="loginForm" method="POST" action="j_security_check">
        <p><strong>Please type your user name: </strong>
            <input type="text" name="j_username" size="25" /></p>
        <p><strong>Please type your password: </strong>
            <input type="password" size="15" name="j_password" /></p>
        <p>
            <input type="submit" value="Submit"/>
            <input type="reset" value="Reset"/>
        </p>
    </form>
</h:body>

Мой метод сервлета проверки:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
        String username;
        String password;
        username = request.getParameter("j_username").toString();
        password = request.getParameter("j_password").toString();
        request.login(username, password);
        response.sendRedirect("/SecureMessageWebInterface/");
    } catch (Exception e) {
        response.sendRedirect("error.xhtml");
    }           
}

И необходимая часть файла конфигурации ....

<security-constraint>
    <display-name>Web Interface</display-name>
    <web-resource-collection>
        <web-resource-name>SSL Pages</web-resource-name>
        <description/>
        <url-pattern>/</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <description>All site is restricted</description>
        <role-name>user</role-name>
    </auth-constraint>
    <user-data-constraint>
        <description>Secure connection is required</description>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>
<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>webapps</realm-name>
    <form-login-config>
        <form-login-page>/login.xhtml</form-login-page>
        <form-error-page>/error.xhtml</form-error-page>
    </form-login-config>
</login-config>

Надеюсь, это может пригодиться кому-то еще

Всего наилучшего,

Alejandro.

0 голосов
/ 08 апреля 2011

Я не могу заставить контейнер снова показывать окно входа в систему для проверки пользователя и возможности смены пользователя ... И мой пользователь всегда может вернуться назад, нажав кнопку НАЗАД в браузереили просто напишите URL и продолжайте делать там, когда предполагается, что существующего сеанса не должно быть.

Эти страницы, скорее всего, отображаются из кэша браузера, а не повторно запрашиваются изсервер.Чтобы остановить это, создайте Filter, который сопоставляется с интересующим шаблоном URL (*.jsf может быть?) И выполняет следующую процедуру в методе doFilter():

HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Cache-Control", "no-cache,no-store,must-revalidate"); // HTTP 1.1
httpResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0
httpResponse.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(request, response);

Очистите кеш браузера перед тестированием.

...