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



我的项目有一个模板main.xhtml和三个视图login.xhtmldashboard.xhtmlnew.xhtml。一旦我登录login.xhtmlLoginBean将验证,如果成功,则需要dashboard.xhtml。如果用户需要创建新记录,请单击新按钮,这将new.xhtml

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

听起来好像您正在家庭开发身份验证。在这种情况下,您还需要家庭增长访问限制。这通常使用 servlet 过滤器来完成。

假设您在@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/image)时,这将继续请求。

如果使用容器托管身份验证,则不需要筛选器。另请参阅如何处理数据库中用户的身份验证/授权?

相关内容

  • 没有找到相关文章