7

Tomcat 7 で実行される Java 6 アプリケーションとして Axis Web サービスを作成しました。セキュリティのために、Spring Security 2.0.1 フレームワークが統合されています。

セキュリティ上の理由から、サービス エンドポイントは基本認証で保護する必要があります。ただし、WSDL ドキュメントは公開されている必要があります。

次のような Spring セキュリティ構成を作成しました。


<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">

    <http>
        <intercept-url pattern="/services/InitechAuthenticationService*" access="ROLE_WSUSER" />
        <intercept-url pattern="/services/InitechAuthenticationService?wsdl" filters="none" />
        <http-basic />
    </http>

    <authentication-provider>
        <user-service>
            <user name="internal" password="${WS_USER_INTERNAL_PASSWORD}" authorities="ROLE_WSUSER" />
            <user name="external" password="${WS_USER_EXTERNAL_PASSWORD}" authorities="ROLE_WSUSER" />
        </user-service>
    </authentication-provider>

</beans:beans>

問題は、intercept-url 行の順序に関係なく、行が


<intercept-url pattern="/services/InitechAuthenticationService*" access="ROLE_WSUSER" />

常に適用されているようで、行


<intercept-url pattern="/services/InitechAuthenticationService?wsdl" filters="none" />

は無視されます。たとえば、順序を指定して (Spring Security が最初または最後に一致するルールを選択するように)、またはルールの特異性によって、Spring Security が最も具体的なルール、つまりこの場合、最後に「wsdl」を含むもの。WSDL ドキュメントを認証から除外し、同時に WS を実際に使用するための認証を有効にするにはどうすればよいですか?

4

1 に答える 1

4

Ant Path Matcherの代わりに正規表現を使用するように構成の http 部分を変更することで、問題を解決しました。完全な作業構成は次のとおりです。


<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">

    <http path-type="regex">
        <intercept-url pattern="/services/InitechAuthenticationService*" access="ROLE_WSUSER" />
        <intercept-url pattern="/services/InitechAuthenticationService\\?wsdl" filters="none" />
        <http-basic />
    </http>

    <authentication-provider>
        <user-service>
            <user name="internal" password="${WS_USER_INTERNAL_PASSWORD}" authorities="ROLE_WSUSER" />
            <user name="external" password="${WS_USER_EXTERNAL_PASSWORD}" authorities="ROLE_WSUSER" />
        </user-service>
    </authentication-provider>

</beans:beans>

変更:

  1. http に path-type "regex" 属性を追加
  2. かわった ?に \\?wsdl のインターセプト URL で
于 2012-05-04T08:40:55.477 に答える