2

良い時間。

1 つのアプリケーションに 8 つの Web サービスがあるとします。そのうちの 5 つは承認を必要とし (クライアントは JSESSIONID Cookie を提供する必要があり、対応するセッションを無効にしてはなりません)、他の 3 つは jsessionid Cookie なしで呼び出すことができます。私の単純な解決策は、リクエストをインターセプトして pathInfo を取得するサーブレット フィルタを作成することです (すべてのサービスは同じ URL 構造を持っています: /service/ serviceSuffix )。serviceSuffixを含む列挙型があります承認が必要な各 Web サービスの。リクエストが取得されると、pathInfo が収集されます。この pathInfo が列挙型に含まれていて、対応する有効なセッションがある場合、要求はフィルター チェーンに先立って送信されます。それ以外の場合、エラーがクライアントに返されます。しばらくして、具体的なサービスの wsdl と xsds を取得する機能を追加する必要があることに気付きました。そのため、さらに2つのチェックが追加されました。

public class SecurityFilter implements Filter {

public static final String WSDL = "wsdl";
public static final String XSD = "xsd=";

/**
 * Wittingly left empty
 */
public void init(FilterConfig filterConfig) throws ServletException {}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        HttpServletRequest servletRequest = (HttpServletRequest) request;
    HttpServletResponse servletResponse = (HttpServletResponse)response;
    String pathInfo = servletRequest.getPathInfo();
    String queryString = servletRequest.getQueryString();

    if (pathInfo != null && SecureWebServices.contains(pathInfo)) {
        if (queryString != null && (queryString.equals(WSDL) || queryString.startsWith(XSD))) {
            // wsdl or xsd is requested
            chain.doFilter(request, response);

        } else {
            // a web service's method is called
            HttpSession requestSession = servletRequest.getSession(false);
            if (requestSession != null) { // the session is valid
                chain.doFilter(request, response);
            } else {
                servletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
                return;
            }
        }
    } else {
        chain.doFilter(request, response);
    }
}

/**
 * Wittingly left empty
 */
public void destroy() {}

}

リクエストの pathInfo が列挙型に含まれていない場合、このリクエストが渡されるため (予期しないシステム コールが発生した場合)、あまり安全ではないようです。

何をすべきか、セキュリティレベルを上げる方法を教えてください。構成可能なシステムを構築したい (それが列挙型を持っている理由です。そこにパスを追加して Web サービスを保護することができ、各 Web サービスでセキュリティ コードを複製する必要はありません)。増やす方法

4

1 に答える 1

0

わからないかもしれませんが。

jsessionid はセキュリティとは何の関係もありません。あなたはただそれを手に入れるだけです。

次に、認証または承認が必要かどうかわかりません。提供されたコードは、セキュリティ機能を提供しません。

とにかく認証に興味があると思います。セキュリティ ロジックは、標準の Web コンテナ機能で提供できます。リクエストのヘッダーで認証データを送信するだけで完了です。Web コンテナーは、選択したリソース (URL) のみを保護するように構成できます

于 2012-04-27T12:01:19.643 に答える