我的项目有一个模板main.xhtml
和三个观看次数login.xhtml
,dashboard.xhtml
,new.xhtml
。登录login.xhtml
后,LoginBean
将验证,如果成功,则会dashboard.xhtml
。如果用户需要创建新记录,则单击新按钮,该按钮将转到new.xhtml
。
但问题是,如果直接从浏览器请求dashboard.xhtml
,那么它无需登录即可正常工作。我是否需要检查用户登录的每个视图?我怎样才能做到这一点?
答案 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?