Перенаправление пользователя после входа в систему на основе контейнера с использованием JAAS и JSF - PullRequest
2 голосов
/ 28 января 2011

Я пытаюсь выполнить регистрацию на основе jsf2 формы, где пользователь может сразу перейти по выбранному URL-адресу после перенаправления на login-page.Как это можно сделать?Мои текущие настройки следующие (с использованием glassfish 3)

Web.XML

<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/login.jsf</form-login-page>
        <form-error-page>/login.jsf</form-error-page>
    </form-login-config>
</login-config>
<security-constraint> //(omitted) all pages except login.jsf requires login </security-constraint>

Управляемый EJB-компонент, управляемый сессией,

public String login(){
    try{
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        request.login(username, pwd);
        loggedInUser = userBean.findByLogin(username);
        username = null;
        pwd = null;
        //context.getExternalContext().redirect((String)request.getAttribute("from"));
        return "/index?faces-redirect=true";

    } catch(Exception e){
        logger.log(Level.FINE, "login failed: {0}", e.getMessage());
        JsfUtil.addErrorMessage("Login failed");
        return null;
    }
}

Из другого вопроса, который я получилсовет использовать фильтр вместо содержащегося обработанного перенаправления на страницу входа в систему и сохранить URL-адрес перед перенаправлением в качестве атрибута в запросе, например так:

public class LoginFilter implements Filter {
    private String loginPage = "/login.jsf";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
        ServletException {
        if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) {
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
            // is session expire control required for this request?
            if (httpServletRequest.getUserPrincipal() == null) {
                // User is not logged in, redirect to login page.
                httpServletRequest.setAttribute("from", httpServletRequest.getRequestURI());
                httpServletResponse.sendRedirect(loginPage);
            }
            else
                filterChain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
    }

}

При том же шаблоне URL, установленном на тот жекак сумма всех ограничений безопасности.Проблема заключается в том, как совместить это с логином на основе контейнера.Если оставить метод авторизации login-config как FORM, фильтр не будет выполнен.При его удалении для метода auth устанавливается значение BASIC, что 1. приводит к тому, что моя форма не отображается, и 2. для httpServletRequest.getUserPrincipal () веб-браузер автоматически устанавливает кэшированное значение, поэтому даже если фильтр выполняется, if-утверждение всегда будет ложным.Из того, что я знаю, нет способа удержать браузер от этого, даже если сеанс признан недействительным.

Есть ли какое-либо решение для этого?

...