1

私のプロジェクトには、テンプレートmain.xhtmlと 3 つのビューlogin.xhtmldashboard.xhtmlありnew.xhtmlます。にログインするlogin.xhtmlと、LoginBeanが検証され、成功した場合は にかかりdashboard.xhtmlます。ユーザーが新しいレコードを作成する必要がある場合は、[新しい] ボタンをクリックしますnew.xhtml

しかし問題は、dashboard.xhtmlブラウザから直接リクエストされた場合、ログインせずに機能することです。ユーザーがログインしているすべてのビューを確認する必要がありますか? どうすればこれを達成できますか?

4

1 に答える 1

1

認証を自作しているように聞こえます。その場合、アクセス制限も自作する必要があります。これは通常、サーブレット フィルタを使用して行います。

@RequestScopedBean で次のようにログインしていると仮定すると、

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) がリクエストされている場合は、リクエストが続行されることに注意してください。

コンテナー管理認証を使用していた場合、フィルターは不要でした。データベース内のユーザーで認証/承認を処理する方法も参照してください。

于 2013-01-24T10:54:39.487 に答える