2012-04-21 5 views
2

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

答えて

0

多分私は理解できませんが。

jsessionidはセキュリティに関しては関係ありません。あなたは単にそれを得るだけです。

次へ認証や認可を希望するかどうかはわかりません。提供されたコードはセキュリティ機能を提供しません。

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

関連する問題