良い時間。Webサービスのセキュリティプロキシとしてのサーブレットフィルタ
1つのアプリケーションに8つのWebサービスがあるとします。それらのうち5つは認可を必要とし(クライアントはJSESSIONIDクッキーを提供しなければならず、対応するセッションを無効にしてはいけません)、他の3つはjsessionidクッキーなしで呼び出すことができます。私の素朴な解決策は、要求を傍受してpathInfoを取得するサーブレットフィルタを書くことです(すべてのサービスは同じURL構造を持っています:/ service/serviceSuffix)。認可を必要とする各WebサービスのserviceSuffixを含むenumがあります。リクエストが取得されると、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() {}
}
リクエストのパス情報が列挙されていない場合、この要求は(ちょうどいくつかの予期しないシステムコールの場合)に渡されたので、それは、非常に安全ではないようです。
セキュリティレベルを向上させる方法を教えてください。私は構成可能なシステムを構築したいのです(つまり、列挙型のWebサービスを保護するためにパスを追加するだけで、各Webサービスのセキュリティコードを複製する必要はありません)。どのように増やす