matsukaz's blog

Agile, node.js, ruby, AWS, cocos2d-xなどなどいろいろやってます

Spring Web Services まとめ その9

Authentication(認証)(Chapter 7)

WS-Securityでは、認証を行うための方法として以下の2種類が存在する。

    • ユーザ名とパスワードのトークン(平文またはダイジェスト認証)を利用
    • X509証明書を利用
平文による認証

最も単純な認証方式。平文による認証を行う場合は、SOAPメッセージに含められるUsernameToken要素を利用する。
全ての入力メッセージにUsernameToken要素を含ませるためには、セキュリティ・ポリシー・ファイルにRequireUsernameToken要素を記述する必要がある。以下は、セキュリティ・ポリシー・ファイルの記述例である。

<xwss:SecurityConfiguration xmlns:xwss="http://java.sun.com/xml/ns/xwss/config">
    ...
    <xwss:RequireUsernameToken passwordDigestRequired="false" nonceRequired="false"/>
    ...
</xwss:SecurityConfiguration>

上記の設定後、SOAPメッセージにusernameTokenが渡されなかった場合には、XwsSecurityInterceptorがSOAPフォルトを送信元に返す。もしもusernameTokenが渡されていた場合には、PasswordValidationCallbackを実行し、登録したハンドラが呼ばれる。以下は登録可能なハンドラである。

  • SimplePasswordValidationCallbackHandler
    • 最も単純なハンドラ。パスワードはイン・メモリのPropertiesオブジェクトで保持する。
<bean id="passwordValidationHandler"
    class="org.springframework.ws.soap.security.xwss.callback.SimplePasswordValidationCallbackHandler">
    <property name="users">
        <props>
            <prop key="Bert">Ernie</prop>
        </props>
    </property>
</bean>
  • AcegiPlainTextPasswordValidationCallbackHandler
<beans>
  <bean id="acegiHandler"
      class="org.springframework.ws.soap.security.xwss.callback.acegi.AcegiPlainTextPasswordValidationCallbackHandler">
    <property name="authenticationManager" ref="authenticationManager"/>
  </bean>
  <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
      <property name="providers">
          <bean class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
              <property name="userDetailsService" ref="userDetailsService"/>
          </bean>
      </property>
  </bean>
  <bean id="userDetailsService" class="com.mycompany.app.dao.UserDetailService" />
  ...
</beans>
  • JaasPlainTextPasswordValidationCallbackHandler
    • 認証処理にJAASを利用するハンドラ。このハンドラを利用するためには、loginContextNameが必要となる。
<bean id="jaasValidationHandler"
    class="org.springframework.ws.soap.security.xwss.callback.jaas.JaasPlainTextPasswordValidationCallbackHandler">
    <property name="loginContextName" value="MyLoginModule" />
</bean>
ダイジェスト認証

ダイジェスト認証の場合も、平文による認証と同様にSOAPメッセージに含められるUsernameToken要素を利用する。平文による認証との違いは、パスワードが平文ではなくダイジェスト認証で暗号化されていることである。以下は、ダイジェスト認証の場合のセキュリティ・ポリシー・ファイルの記述例である。

<xwss:SecurityConfiguration xmlns:xwss="http://java.sun.com/xml/ns/xwss/config">
    ...
    <xwss:RequireUsernameToken passwordDigestRequired="true" nonceRequired="true"/>
    ...
</xwss:SecurityConfiguration>

以下はダイジェスト認証で登録可能なハンドラである。

  • SimplePasswordValidationCallbackHandler
    • 平文による認証と同様
  • AcegiDigestPasswordValidationCallbackHandler
<beans>
    <bean class="org.springframework.ws.soap.security.xwss.callback.acegi.AcegiDigestPasswordValidationCallbackHandler">
        <property name="userDetailsService" ref="userDetailsService"/>
    </bean>

    <bean id="userDetailsService" class="com.mycompany.app.dao.UserDetailService" />
    ...
</beans>
証明書による認証

X509証明書を利用することで、よりセキュアな認証を行うことができる。この認証方法では、SOAPメッセージに含められるBinarySecurityToken要素を利用する。全ての入力メッセージにBinarySecurityToken要素を含ませるためには、セキュリティ・ポリシー・ファイルにRequireSignature要素を記述する必要がある。以下は、セキュリティ・ポリシー・ファイルの記述例である。

<xwss:SecurityConfiguration xmlns:xwss="http://java.sun.com/xml/ns/xwss/config">
    ...
    <xwss:RequireSignature requireTimestamp="false">
    ...
</xwss:SecurityConfiguration>

上記の設定後、SOAPメッセージに証明書が渡されなかった場合には、XwsSecurityInterceptorがSOAPフォルトを送信元に返す。もしも証明書が渡されていた場合には、CertificateValidationCallbackを実行し、登録したハンドラが呼ばれる。以下は登録可能なハンドラである。

  • KeyStoreCallbackHandler
    • 証明書の検証にJava標準のキーストアを利用するハンドラ。KeyStoreCallbackHandlerを利用する場合は、ほとんどの場合はtrustStoreプロパティのみ設定すればよい。
<beans>
    <bean id="keyStoreHandler" class="org.springframework.ws.soap.security.xwss.callback.KeyStoreCallbackHandler">
        <property name="trustStore" ref="trustStore"/>
    </bean>

    <bean id="trustStore" class="org.springframework.ws.soap.security.support.KeyStoreFactoryBean">
        <property name="location" value="classpath:truststore.jks"/>
        <property name="password" value="changeit"/>
    </bean>
</beans>
  • AcegiCertificateValidationCallbackHandler
<beans>
    <bean id="acegiCertificateHandler"
        class="org.springframework.ws.soap.security.xwss.callback.acegi.AcegiCertificateValidationCallbackHandler">
        <property name="authenticationManager" ref="authenticationManager"/>
    </bean>

    <bean id="authenticationManager"
        class="org.acegisecurity.providers.ProviderManager">
        <property name="providers">
            <bean class="org.acegisecurity.providers.x509.X509AuthenticationProvider">
                <property name="x509AuthoritiesPopulator">
                    <bean class="org.acegisecurity.providers.x509.populator.DaoX509AuthoritiesPopulator">
                        <property name="userDetailsService" ref="userDetailsService"/>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>

  <bean id="userDetailsService" class="com.mycompany.app.dao.UserDetailService" />
  ...
</beans>
  • JaasCertificateValidationCallbackHandler
    • 認証処理にJAASを利用するハンドラ。このハンドラを利用するためには、loginContextNameが必要となる。
<bean id="jaasValidationHandler"
    class="org.springframework.ws.soap.security.xwss.callback.jaas.JaasCertificateValidationCallbackHandler">
    <property name="loginContextName">MyLoginModule</property>
</bean>