良い時間。
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 サービスでセキュリティ コードを複製する必要はありません)。増やす方法