我的项目有一个模板main.xhtml
和三个视图login.xhtml
, dashboard.xhtml
, new.xhtml
. 一旦我登录login.xhtml
,LoginBean
将验证,如果成功,则将需要dashboard.xhtml
。如果用户需要创建一个新记录,他点击新按钮new.xhtml
。
但问题是,如果dashboard.xhtml
直接从浏览器请求,则无需登录即可工作。我需要检查用户登录的每个视图吗?我怎样才能做到这一点?
我的项目有一个模板main.xhtml
和三个视图login.xhtml
, dashboard.xhtml
, new.xhtml
. 一旦我登录login.xhtml
,LoginBean
将验证,如果成功,则将需要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/图像)时,这将继续请求。
如果您使用的是容器管理的身份验证,则不需要过滤器。另请参阅如何处理数据库中用户的身份验证/授权?