Запретить пользователям доступ к странице вручную - PullRequest
1 голос
/ 28 февраля 2012

Я внедрил слушатель фазы jsf, который проверяет, вошел ли пользователь в систему или нет, и, если нет, перенаправляет пользователя на страницу входа.

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

Как это сделать в JSF?

Ответы [ 2 ]

2 голосов
/ 29 февраля 2012

Просто используйте простой сервлет Filter, который сопоставлен с общим шаблоном URL-адресов страниц с ограниченным доступом, таких как /app/*, /pages/*, /secured/* и т. Д. Вот пример с предположением, что у вас есть @SessionScoped @ManagedBean UserManager.

@WebFilter(urlPatterns={"/app/*"})
public class AuthenticationFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        UserManager userManager = (session != null) ? (UserManager) session.getAttribute("userManager") : null;

        if (userManager == null || !userManager.isLoggedIn()) {
            response.sendRedirect(request.getContextPath() + "/login.xhtml"); // No logged-in user found, so redirect to login page.
        } else {
            chain.doFilter(req, res); // Logged-in user found, so just continue request.
        }
    }

    // ...
}
0 голосов
/ 29 февраля 2012

Я на JSF 1.2 и сделал это так:

public void beforePhase(PhaseEvent event) 
{
    FacesContext fCtx = FacesContext.getCurrentInstance();
    String actualView = null;
    actualView = event.getFacesContext().getApplication().getViewHandler().getResourceURL(fCtx, fCtx.getViewRoot().getViewId());  
    //actualView is the page the user wants to see
    //you can check, if the user got the permission, is logged in, whatever
}

public PhaseId getPhaseId() 
{
    return PhaseId.RENDER_RESPONSE;
}
...