JSF form-login-page перенаправляет попадания перед моим фильтром - PullRequest
1 голос
/ 17 октября 2011

Я пытаюсь реализовать функцию запомнить меня в своем приложении java ee 6, но у меня есть проблемы в сочетании со встроенной функцией безопасности. У меня есть следующая конфигурация в моем web.xml:

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>my-realm</realm-name>
    <form-login-config>
        <form-login-page>/login.jsf</form-login-page>
        <form-error-page>/login.jsf</form-error-page>
    </form-login-config>
</login-config>

То, что я пытаюсь создать, - это фильтр, который автоматически регистрирует человека в его сеансе, истек, если у него есть cookie, содержащий некоторые данные. Это работает, но когда вызывается фильтр, перенаправление на login.jsf уже вступило в силу, прежде чем я могу что-то изменить. Я предположил, что фильтры вызываются до собственной системы безопасности java ee, поскольку они на самом деле вызываются на защищенных страницах, но, похоже, это не так. Есть ли какой-нибудь способ, позволяющий пользователю перейти на ту же страницу, которую он запрашивал, вместо того, чтобы быть перенаправленным на login.jsf?

Фильтр:

@WebFilter(
    filterName="authFilter",
    servletNames={
        "Faces Servlet"
    }
)
public class AuthFilter implements Filter {

    public AuthFilter() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        User user = (User)req.getSession().getAttribute("user");
        if(user == null){
            String uuid = CookieUtil.getCookieValue(req, "rememberme");
            if(uuid != null){
                UserBean userBean = EJBUtil.lookup(UserBean.class);
                RememberMe rememberme = userBean.findRememberMe(uuid);
                if(rememberme != null){
                    user = rememberme.getUser();
                    try{
                        req.login(user.getEmail(), user.getPasswordDigest());
                        req.getSession().setAttribute("user", user);
                        CookieUtil.addCookie(res, "rememberme", uuid, CookieUtil.AGE_ONE_YEAR);
                    }catch(ServletException e){}
                }
                else{
                    CookieUtil.removeCookie(res, "rememberme");
                }
            }
        }
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    }

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

1 Ответ

2 голосов
/ 17 октября 2011

Управляемая контейнером аутентификация действительно запускается перед всеми фильтрами.Это ограничение безопасности.

В основном у вас есть 3 варианта:

  • Вместо этого используйте программную фильтрацию и вход в систему, чтобы иметь более точный контроль.
  • Делатьзадание в preRenderView методе события bean-компонента, связанного с login.jsf.
  • Получите платформу, которая поддерживает средство «Запомнить меня» поверх прозрачной управляемой безопасности контейнера, такой как Apache Shiro или Spring Security.
...