7

私はCXFのWS-security実装(usernametoken)と一緒にしようとしています。http://cxf.apache.org/docs/ws-security.htmlで述べられているようにすべてを実行しました。PasswordCallbackHandlerは機能しているようですが、気になるのはその一部です。

    if (pc.getIdentifier().equals("joe")) {
        // set the password on the callback. This will be compared to the
        // password which was sent from the client.
        pc.setPassword("password");
    }

言われるように

CXF 2.3.xまでの場合、プレーンテキストパスワード(またはその他のまだ不明なパスワードタイプ)の特殊なケースのパスワード検証がコールバッククラスに委任されることに注意してください。org.apache.ws.securityを参照してください。 WSS4Jプロジェクトのprocessor.UsernameTokenProcessor#handleUsernameToken()メソッドjavadoc。その場合、ServerPasswordCallbackは次のようになります。

したがって、cxf 2.3.xまでは、そのように実行されていました。

   if (pc.getIdentifer().equals("joe") {
       if (!pc.getPassword().equals("password")) {
            throw new IOException("wrong password");
       }
    }

私の問題は、pc.setPassword( "plainTextPassword")を任意のリソースに保存したいので、したくないということです。この2.3.xまでの設計では、手動で暗号化できるため、これを実行できます。コールバックで暗号化されたパスワードを設定したり、保存された暗号化されたパスワードに対してユーザー名トークン認証を行う方法はありますか?

私はcxf2.5.xを使用しています

4

2 に答える 2

6

答え(私が試したもの)は、このブログページにあります:

http://coheigea.blogspot.com/2011/06/custom-token-validation-in-apache-cxf.html

本質は、org.apache.ws.security.validate.UsernameTokenValidator のサブクラスを作成し、verifyPlaintextPassword メソッドをオーバーライドすることです。そのメソッドでは、(getName と getPassword を提供する) UsernameToken が渡されます。有効でない場合は例外をスローします。

カスタムバリデーターをSpring構成にインストールするには、egを追加します

  <jaxws:properties>
    <entry key="ws-security.ut.validator">
        <bean class="com.example.webservice.MyCustomUsernameTokenValidator" />
    </entry>
  </jaxws:properties>

<jaxws:endpoint/> に。

于 2012-09-11T19:48:23.063 に答える
2

コールバック ハンドラーは、平文のパスワードを提供したり、平文のパスワードがわかっているダイジェスト パスワードを検証したりするために存在します。

しかし、平文、つまり一方向ハッシュがわからない場合は、コールバック インターフェイスは適切ではないため、Validatorインターフェイスを実装するクラスを作成する必要があります。

これは、パスワードがすでに BCrypt ハッシュとして保存されている JPA リポジトリを使用するインターフェイスの実装例です。

ここws-security.ut.validatorに記載されているプロパティで使用します

つまり、CXF プロパティとして <entry key="ws-security.ut.validator" value-ref="com.package.CustomUsernameTokenValidator" />

public class CustomUsernameTokenValidator implements Validator {
    @Autowired
    ProfileRepository profileRepository;
    @Override
    public Credential validate(Credential credential, RequestData requestData) throws WSSecurityException {
        Profile profile = profileRepository.findByName(credential.getUsernametoken().getName());
        if (profile != null) {
            if (BCrypt.checkpw(credential.getUsernametoken().getPassword(), profile.getPassword())) {
                return credential;
            }
        }
        throw new WSSecurityException(WSSecurityException.ErrorCode.FAILED_AUTHENTICATION);     
    }
}
于 2015-03-22T21:52:37.603 に答える