1

Spring ベースのアプリケーションを開発しており、Spring Security 3.1.3 を使用しています。認証しようとするたびに、認証が成功しません。ここに私のsecurity-config.xmlがあります:

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

<security:http auto-config="true">
<security:form-login login-page="/app/main"
default-target-url="/app/account" />
<security:logout logout-url="/app/logout"
logout-success-url="/app/main" />
</security:http>

<bean id="passwordEncoder"
class="org.springframework.security.crypto.bcrypt. BCryptPasswordEncoder" />

<security:authentication-manager alias="authenticationManager">
<security:authentication-provider
user-service-ref="userService" >
<security:password-encoder ref="passwordEncoder"/>
</security:authentication-provider>
</security:authentication-manager>

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

<bean id="authenticationManager"
class="org.springframework.security.authentication .ProviderManager">
<constructor-arg>
<ref local="daoAuthenticationProvider" />
</constructor-arg>
</bean>


</beans>

私の Bean のパスワード設定メソッドでは、次のように BCryptPasswordEncoder を使用します。

public void setPassword(String password) {
PasswordEncoder passwordEncoder= new BCryptPasswordEncoder();
this.password=passwordEncoder.encode(password);
}

ユーザー名とエンコードされたパスワードをdbに保存します。サインアップ後、初回のみ認証できます。その理由は、Hibernate エンティティ マネージャが、選択後にデータベース内のパスワード値を自動更新するためです。どうしてか分かりません!!!プレーンテキストのパスワードを使用すると、これは何も起こらず、すべて正常に動作します。

4

1 に答える 1

2

「my Bean」が何であるか、またはこの関数がどこで使用されているかについて詳しく説明していないため、確実に知ることは困難ですがsetPassword、Hibernate エンティティの一部である場合は、既にエンコードされたパスワードで呼び出される可能性があります (たとえば、ロード時)。新しいものを作成するときだけでなく、データベースからのエンティティ)。その時点で bcrypt を使用したくないことは確かです。これは、初めてログインできる理由も説明している可能性があり、フィールドを自動的に更新する休止状態の説明から可能性が高いと思われます。

テスト目的で、文字列が (bcrypt 文字列のように) "$2a" で始まっていないことを確認するアサーションを追加してみてください。そうである場合は例外をスローします。

その場合は、作成時にエンティティの外部でエンコーダーを呼び出し、エンコードされたパスワードをセッターに渡すようにしてください。

于 2013-07-28T18:53:19.777 に答える