0

重複の可能性:
JSF HTTP セッション ログイン

Primefaces を使用して Web アプリケーションを実装しています。私の実装では、ユーザーはシステムにログインでき、再度ログインせずにその URL をコピーすることで、リダイレクトされたページを再度読み込むことができます。どうすればこれを防ぐことができますか?

これが私のログインロジックです:

public String doLogin() {
    if(username != null  &&
        username.equals("admin") &&
        password != null  &&
        password.equals("admin")) {
        msg = "table?faces-redirect=true";
    } else
        if(user_name.contains(username) &&
            pass_word.contains(password) &&
            !user_name.contains("admin")) {
            msg = "table1?faces-redirect=true";
        }
    }
    return msg;
}
4

2 に答える 2

2

ユーザー セッションの有効期限が切れていない場合、これは Web アプリケーションの通常の動作です。セッションの有効期限が切れている場合は、ログインしているユーザーが存在し、そのユーザーが URL で使用しているページにアクセスする権限を持っていることを確認する必要があります。これは、フィルターを使用して実現できます。

Web アプリが Tomcat 7 や GlassFish 3.x などの Java EE 6 コンテナー上にあると想定しています。

@WebFilter(filterName = "MyFilter", urlPatterns = {"/*.xhtml"})
public class MyFilter implements Filter {

    public void doFilter(
        ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {

        //get the request page
        String requestPath = httpServletRequest.getRequestURI();
        if (!requestPath.contains("home.xhtml")) {
            boolean validate = false;
            //getting the session object
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            HttpSession session = (HttpSession)httpServletRequest.getSession();
            //check if there is a user logged in your session
            //I'm assuming you save the user object in the session (not the managed bean).
            User user = (User)session.get("LoggedUser");
            if (user != null) {
                //check if the user has rights to access the current page
                //you can omit this part if you only need to check if there is a valid user logged in
                ControlAccess controlAccess = new ControlAccess();
                if (controlAccess.checkUserRights(user, requestPath)) {
                    validate = true;
                    //you can add more logic here, like log the access or similar
                }
            }
            if (!validate) {
                HttpServletResponse httpServletResponse = (HttpServletResponse) response;
                httpServletResponse.sendRedirect(
                    httpServletRequest.getContextPath() + "/home.xhtml");
            }
        }
        chain.doFilter(request, response);
    }
}

ControlAccess クラスの実装:

public class ControlAccess {

    public ControlAccess() {
    }

    public boolean checkUserRights(User user, String path) {
        UserService userService = new UserService();
        //assuming there is a method to get the right access for the logged users.
        List<String> urlAccess = userService.getURLAccess(user);
        for(String url : urlAccess) {
            if (path.contains(url)) {
                return true;
            }
        }
        return false;
    }
}

これを説明する良い方法を探しているときに、BalusC (JSF エキスパート) からより良い答えを見つけました。これは JSF 2 ベースです。

于 2012-10-01T04:31:20.330 に答える
0

フォームベースの認証を実行して、認証されていないユーザーが内部ページにアクセスできないように保護できます。

この例のように、JDBC レルム認証を使用してコンテナーに認証を処理させることもできます。

于 2012-10-01T05:48:07.727 に答える