2011-10-05 19 views
50

ここではチュートリアルはありますか、誰かが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が私のaccountDAOuserDetails.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から取得するようにセキュリティ設定を設定する方法を知りませんでした。とにかくそれがどれくらい必要なのか分かりません。

答えて

34

答えとして、私は私の問題を解決し、他のコメントや回答は与えられなかったとして、私は、このマークされます:

編集1 - オルタナティブ1私が持っていた元の質問

しかしに答えますカスタマイズされたパスワードソルトがSpring Security 3.1では不要な従来のアプローチであることを知りました。

編集3ここで私はどのようにパスワードと共に保存されている自動塩にはStandardPasswordEncoderを使用してください。何が価値があるために

+1

あなたの投稿は本当に私に非常によく似た問題を抱えていました。 +1の自己解決^^ – user1431729

+4

私は、StandardPasswordEncoderの代わりにBCryptPasswordEncoderを提案します。 BCryptPasswordEncoderは、セキュリティと他言語との相互運用性の面で優れた選択肢です – Farm

0

豆からグローバル塩を取得するには、春の式言語やSPELを使用しています。

<beans:bean id="encoder" 
     class="org.springframework.security.crypto.password.StandardPasswordEncoder"> 
    <constructor-arg value="#{someotherBean.somePropertyWithAGetterMethod"/> 
</beans:bean> 
関連する問題