2013-05-09 6 views
5

私は、Spring SecurityをLDAPサーバに対して認証するように設定しました。Spring LdapAuthenticationとローカルデータベースからロールをロード

<security:authentication-manager > 
    <security:ldap-authentication-provider user-dn-pattern="uid={0}" /> 

</security:authentication-manager> 

認証後、同じユーザーのローカルデータベースからロールを読み込みたいとします。 "ldap-authentication-provider"を使用してローカルデータベースの役割をロードするにはどうすればよいですか?

私は以下のように第二の認証プロバイダを追加する場合:

<security:authentication-manager > 
    <security:ldap-authentication-provider user-dn-pattern="uid={0}" /> 
      <security:authentication-provider ref="daoAuthenticationProvider" /> 
</security:authentication-manager> 

daoAuthenticationProviderが追加しましたが、最初の認証プロバイダーがユーザーを認証する際の春は、第二プロバイダを使用していません。最初の認証プロバイダが認証に失敗した場合にのみ、それはリストの次のものになります。私たちは、ローカルデータベースからのロールをロードするために

<security:ldap-authentication-provider user-dn-pattern="uid={0}" /> 

をカスタマイズするために持っているよう

だから、基本的に見えます。

提案がありますか?これはどのように実装されるべきですか?

答えて

5

認証プロバイダーは、成功した認証で完全に実装された認証トークンを提供する必要があります。したがって、1つのプロバイダーを使用してユーザーの資格情報を確認することも、もう1つはプロバイダー(ロール)を割り当てることもできません。

ただし、ldap認証プロバイダをカスタマイズして、デフォルトの動作(ldapでユーザーのグループを検索)ではなく、データベースからユーザーの役割を取得できます。 LdapAuthenticationProviderには、認証自体を実行する方法(LdapAuthenticator)と、ユーザーの権限(LdapAuthoritiesPopulator)を取得する方法の2種類が注入されています。データベースからロールをロードするLdapAuthoritiesPopulator実装を指定すると、要件を満たすことができます。既にデータベースに対してを使用している場合は、UserDetailsServiceLdapAuthoritiesPopulatorにラップしてLdapAuthenticationProviderに挿入して簡単に統合できます。

この構成はあまり一般的ではないので、セキュリティxml名前空間はタグ/属性を設定するためのものではありませんが、生のbeanの設定はあまり複雑ではありません。ここに概要があります:

1)設定のどこかにldap-serverがあるとします。それにはidを割り当てることが重要です。これにより、後で参照することができます。 authentication-managerセクションから

<security:ldap-server url="..." id="ldapServer" .../> 

2)、あなただけのカスタマイズのプロバイダを参照します:

<security:authentication-manager> 
    <security:authentication-provider ref="customLdapAuthProvider"/> 
</security:authentication-manager> 

3)今、重要な部分:

authenticatorは基本的にあり名前空間設定によって作成されるものと同じです。 (contextSource属性がLDAPサーバーを参照していることに注意してください。)

authoritiesPopulatorは、userService実装の単純なラッパーで、設定のどこかで定義されるはずです。

+0

これは絶対に私が探していたものです。 – user2072797

+0

ユーザーにuserIdを追加する方法はありますか? UserオブジェクトのempIdをldapからuserId属性にマップします。 – user2072797

+0

この質問は元の質問とは無関係のようです。あなたがそれを再フォーマットして新しい質問として投稿すれば、現時点では(実際に)私はそれを見ることができますが、他のユーザーはあなたにより良い回答を与えることができるので、おそらく良いでしょう。とにかく、ldapからDBへのユーザー属性のマッピングは絶対に可能ですが、Spring Securityで行うことはできません。 – zagyi

関連する問題