如果用户未登录,如何限制访问

时间:2013-01-24 10:06:21

标签: jsf authentication

我的项目有一个模板main.xhtml和三个观看次数login.xhtmldashboard.xhtmlnew.xhtml。登录login.xhtml后,LoginBean将验证,如果成功,则会dashboard.xhtml。如果用户需要创建新记录,则单击新按钮,该按钮将转到new.xhtml

但问题是,如果直接从浏览器请求dashboard.xhtml,那么它无需登录即可正常工作。我是否需要检查用户登录的每个视图?我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

听起来就好像你在家里进行身份验证一样。在这种情况下,您还需要homegrow访问限制。通常使用servlet filter来完成。

假设您在@RequestScoped bean中按如下方式登录,

public String login() {
    User user = userService.find(username, password);
    FacesContext context = FacesContext.getCurrentInstance();

    if (user != null) {
        context.getExternalContext().getSessionMap().put("user", user);
        return "dashboard.xhtml?faces-redirect=true";
    } else {
        context.addMessage(null, new FacesMessage("Unknown login, try again."));
        return null;
    }
}

然后,您可以在@WebFilter("/*")过滤器中检查登录用户,如下所示:

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    HttpSession session = request.getSession(false);

    User user = (session != null) ? session.getAttribute("user") : null;
    String loginURL = request.getContextPath() + "/login.xhtml";

    boolean loginRequest = request.getRequestURI().startsWith(loginURL);
    boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER);

    if (user != null || loginRequest || resourceRequest)) {
        chain.doFilter(request, response);
    } else {
        response.sendRedirect(loginURL);
    }
}

因此请注意,当用户登录时,或者直接请求登录页面本身,或者请求JSF资源(CSS / JS /图像)时,这将继续请求。

如果您使用的是容器管理身份验证,那么过滤器就没必要了。另请参阅How to handle authentication/authorization with users in a database?

相关问题