0

3.0.7 スプリング セキュリティから 3.1.2 に移行しましたが、in-memory-config を使用するテストの 1 つが不正な資格情報で失敗します。

特別なことは何もしません。ユーザーの 1 人をプレーン テキストのユーザー名とパスワードで認証するだけです。認証されたら、権限を入力します。

コード:

public Authentication authenticate(UserDetails userDetails)
        throws AuthenticationException {
    try {
        org.springframework.security.core.Authentication authenticate = authenticationManager.authenticate(createAuthenticationRequest(userDetails));
        if (!authenticate.isAuthenticated()) {
            throw new AuthenticationException("Authentication failed for user ["+userDetails.getUsername()+"]");
        }

        Collection<? extends GrantedAuthority> grantedAuthorities = authenticate.getAuthorities();
                    ...
             } catch(Exception exception) {
        throw new AuthenticationException(exception);
    }

コード:

<bean id="daoAuthenticationProvider" 
    class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
    <property name="userDetailsService" ref="daoUserDetailsService" />
</bean>

<bean id="daoUserDetailsService" class="org.springframework.security.core.userdetails.memory.InMemoryDaoImpl">
    <property name="userMap">
        <value>
            Edward = koala, READ_ONLY
        </value>
    </property>
</bean>

認証の呼び出しで次の例外が発生します。

Caused by: org.springframework.security.authentication.BadCre dentialsException: Bad credentials
at org.springframework.security.authentication.dao.Da oAuthenticationProvider.additionalAuthenticationCh ecks(DaoAuthenticationProvider.java:67)
at org.springframework.security.authentication.dao.Ab stractUserDetailsAuthenticationProvider.authentica te(AbstractUserDetailsAuthenticationProvider.java: 149)
at org.springframework.security.authentication.Provid erManager.authenticate(ProviderManager.java:156)
at org.openspaces.security.spring.SpringSecurityManag er.authenticate(SpringSecurityManager.java:117)
... 11 more

それを回避する方法、またはこの問題が保留中のパッチがあるかどうかについてのアイデアはありますか?

4

2 に答える 2

2

DaoAuthenticationProvider.additionalAuthenticationChecks構成を見ると、空白の解析の問題である可能性がありますが、認証が失敗した理由を確認するためにブレークポイントを配置することでデバッグするのは簡単なはずです。

いずれにせよ、メモリ内ユーザーを構成するためのプロパティ エディター アプローチは廃止され、名前空間構成が優先されます。次のようなものを使用できます

<security:user-service id="daoUserDetailsService">
    <security:user name="Edward" password="koala" authorities="READ_ONLY" />
</security:user-service>

同じ結果が得られます。もちろん、セキュリティ名前空間をアプリケーション コンテキスト ファイルに追加する必要があります。

于 2012-08-16T13:35:40.677 に答える
0

次の回答は、Guy Korland のコメント (12 年 8 月 16 日 20:40) に基づいており、そこでさらにデバッグを行いました。

spring 3.1 以降では、erase-credentials のデフォルト値が 'false' から 'true' に変更されました。これが、パスワードがキャッシュから引き出されるときに無効になる理由です。また、Spring 3.1 より前にテスト ケースが合格した理由についても説明します。キャッシュから取得するクラスは UserDetails であり、Spring が暗号化されていないパスワードを認証すると、そのパスワードは使用されなくなるため、セキュリティ対策として消去されます。簡単なテスト シナリオでは、erase-credentials 値を「false」に上書きできますが、認証が確立された後に暗号化されていないその値に実際に依存している場合は、長期的により安全なソリューションを見つけることを検討してください。

于 2014-06-19T03:21:02.473 に答える