認証を自作しているように聞こえます。その場合、アクセス制限も自作する必要があります。これは通常、サーブレット フィルタを使用して行います。
@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) がリクエストされている場合は、リクエストが続行されることに注意してください。
コンテナー管理認証を使用していた場合、フィルターは不要でした。データベース内のユーザーで認証/承認を処理する方法も参照してください。