ここではチュートリアルはありますか、誰かがSpring-Securityで以下のことを行うための指針を持っていますか?Spring Securityのカスタム認証とパスワードのエンコーディング
タスク:
私が(別名認証認証のユーザ名のための私のデータベースから塩を取得し、格納された暗号化されたパスワードと比較する(ログインページ)から提供されたパスワードを暗号化するためにそれを使用する必要がありますユーザー)。
追加情報:
私はカスタム・データベース構造を使用します。 UserDetails
オブジェクトはカスタムUserDetailsService
によって作成され、カスタムDAOProviderを使用してデータベースから情報を取得します。
これまでのところ、私のsecurity.xml
ファイル:
<authentication-manager>
<authentication-provider user-service-ref="userDetailsService">
</authentication-provider>
</authentication-manager>
は今、私は私が
<password-encoder hash="sha" />
が、他に何をする必要があります推測しますか?パスワードを暗号化するためにデータベース提供の塩を使用するように春のセキュリティをどのように伝えますか?
編集:
私はinformatativeが、十分ではないとThis SO記事を見つけました:私は私のXMLで塩・ソースを定義する場合はそうのように、パスワードのエンコーダが使用する:
<password-encoder ref="passwordEncoder">
<salt-source ref="saltSource"/>
</password-encoder>
カスタムソルトソースを作成してカスタム塩を使用する必要があります。しかし、これはUserDetails
オブジェクト内には見つかりません。だから... ...
オルタナティブ1:
私は、塩の性質を持っているかもしれないUserDetailsのカスタム実装を使用することはできますか?
<beans:bean id="saltSource" class="path.to.MySaltSource"
p:userPropertyToUse="salt"/>
と
@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {
// ...
return buildUserFromAccount(account);
}
@Transactional(readOnly = true)
UserDetailsImpl buildUserFromAccount(Account account){
// ... build User object that contains salt property
}
カスタム・ユーザー・クラス:
public class UserDetailsImpl extends User{
// ...
private String salt;
public String getSalt() { return salt; }
public void setSalt(String salt) { this.salt = salt; }
}
のsecurity.xml:
<authentication-manager>
<authentication-provider user-service-ref="userDetailsService">
<password-encoder hash="sha">
<salt-source ref="saltSource"/>
</password-encoder>
</authentication-provider>
</authentication-manager>
<beans:bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource" p:userPropertyToUse="salt"/>
オルタナティブ2:
そうでなければ私は、データベースから与えられたuserName
ために塩を抽出するためにSaltSource
に私accountDAOを注入する必要があると思います。
BUT:Spring SecurityはどのようにしてSaltSource
を呼び出しますか?いつもsaltSource.getSalt(userDetails)
?
次に、SaltSource
が私のaccountDAO
にuserDetails.accountName
を使用して塩を検索していることを確認してください。
EDIT2:
ちょうど...私のアプローチは..遺産であることを学びました:(だから私は、私はちょうど私はまだ正確に使用する方法を把握する必要がありStandardPasswordEncoder
を(使用してますね)
私はUserクラスを拡張したカスタムUserDetailsクラスで最初のオプションを実装しました。そしてsaltプロパティを追加するだけで、それはSOの投稿で提案されたようにSaltSourceにuserPropertyToUseとして渡されます編集1 ...
EDIT 3:
ちょうどStandardPasswordEncoderが働いてしまったので、私はここにいくつかのポインタを残しておきます:
認証のためのStandardPasswordEncoderを使用します。
<beans:bean id="encoder"
class="org.springframework.security.crypto.password.StandardPasswordEncoder">
</beans:bean>
<authentication-manager>
<authentication-provider user-service-ref="userDetailsService">
<password-encoder ref="encoder" />
</authentication-provider>
</authentication-manager>
これが必要ですバージョン3.1.0.RCのspring-security-cryptoモジュール?私の知る限りでは。 3.0があるリポジトリを見つけることができませんでした。バージョン(3.0.6などを含むバージョンがリストされていたとしても)。また、ドキュメンテーションでは、春のセキュリティ3.1について述べているので、私はちょうどそれと一緒に行くつもりです。 (私のためにそれを行うことができる唯一の管理者)のユーザを作成するとき
、私はちょうど
StandardPasswordEncoder encoder = new StandardPasswordEncoder();
String result = encoder.encode(password);
使用して、私は終わりです。
スプリングセキュリティはランダムに塩を作成し、それをデータベースに保存する前にパスワード文字列に追加するので、塩分の列はもう必要ありません。
また、コンストラクタ引数(new StandardPasswordEncoder("12345");
)としてグローバルなsaltを提供することもできますが、<constructor-arg name="secret" value "12345" />
という静的な文字列を提供する代わりに、その値をBeanから取得するようにセキュリティ設定を設定する方法を知りませんでした。とにかくそれがどれくらい必要なのか分かりません。
あなたの投稿は本当に私に非常によく似た問題を抱えていました。 +1の自己解決^^ – user1431729
私は、StandardPasswordEncoderの代わりにBCryptPasswordEncoderを提案します。 BCryptPasswordEncoderは、セキュリティと他言語との相互運用性の面で優れた選択肢です – Farm