2016-08-23 3 views
1

私たちは、Active Directoryを使用してユーザーを認証し、認可するためのApache史郎を使用しています。ユーザーマッピンググループの認証Apache ShiroでActiveDirectoryRealmを使用しているときにLDAPフィールドを検索するにはどうすればよいですか?

だけで罰金、次の設定を使用して動作します:

adRealm = org.apache.shiro.realm.activedirectory.ActiveDirectoryRealm 
adRealm.searchBase = "OU=MYORGANIZATION,DC=MYDOMAIN,DC=COM" 
adRealm.groupRolesMap = "CN=SOMEREADGROUP":"read","CN=SOMEMODIFYGROUP":"modify","CN=SOMEADMINGROUP":"admin" 
adRealm.url = ldaps://my.ad.url:636 
adRealm.systemUsername= systemuser 
adRealm.systemPassword= secret 
adRealm.principalSuffix= @myorganization.mydomain.com 

私は、次の行を使用して、史郎に認証を行うことができます。

String user = "someuser"; 
String password = "somepassword"; 
Subject currentUser = SecurityUtils.getSubject(); 
if (!currentUser.isAuthenticated()){ 
    UsernamePasswordToken token = new UsernamePasswordToken (user, 
       password); 
    token.setRememberMe (true); 
    currentUser.login (token); 
} 

現在より多くのユーザー情報を取得したいです私たちのActiveDirectoryから。 Apache Shiroを使ってどうすればいいですか?私はドキュメンテーションでそれについて何も見つけることができませんでした。 ActiveDirectoryRealmのソースコードで

私は、この行を見つけました:

NamingEnumeration answer = ldapContext.search(searchBase, searchFilter, searchArguments, searchCtls); 

だから、答えの最初の部分は明確である:それで何かを検索しLdapContextのを使用しています。しかし、私はどのようにLdapContextを取得できますか?

答えて

1

それはあなたがやろうとしているかに依存します。あなたは認証や認可以外の何かのために質問を実行するためにコンテキストを再利用しようとしていますか?または、ADレルムのクエリの動作を変更しようとしていますか?

後者の場合は、ActiveDirectoryRealmを拡張し、queryForAuthorizationInfo()メソッドをオーバーライドする必要があります。

ご使用の環境用にカスタムで何かを実装していますか?

(更新)

カップルの事: レルムには2つのタッチポイントにLdapContextのへのアクセスを持っていますqueryForAuthenticationInfo()queryForAuthorizationInfo()、あなたはADレルムを拡張したりAbstractLdapRealmあなたはすでにそれを持っている必要がありますので、もし。他の情報とadd the extra info to your Principalを返すようにクエリを変更することができます。次に、Subjectオブジェクトから直接その情報にアクセスできます。

あなたのレルムは、シングルトンである必要はありません。

他の種類のユーザー管理(特定の役割を持つすべてのユーザーに電子メールを送信する、ユーザーを作成するなど)を行う場合は、次に、shiro.iniにLdapContextFactoryを作成し、複数のオブジェクトに同じインスタンスを使用できます。

[main] 
... 
ldapContextFactory = org.apache.shiro.realm.ldap.JndiLdapContextFactory 
ldapContextFactory.systemUsername = foobar 
ldapContextFactory.systemPassword = barfoo 

adRealm = org.apache.shiro.realm.activedirectory.ActiveDirectoryRealm 
adRealm.ldapContextFactory = $ldapContextFactory 
... 

myObject = com.biz.myco.MyObject 
myObject.ldapContextFactory = $ldapContextFactory 

myObjectは(などのイベントへの応答)、他史郎コンポーネントと対話している場合、これはうまく動作しますが、それほど、あなたは他のフレームワークからそれにアクセスする必要がある場合。あなたはldapContextFactoryを作成する何らかの静的初期設定によってこれを回避することができますが、私の意見では、これはshiro.iniを使用するスウィートスポットが終わり、GuiceまたはSpringを使用する場所です。おそらく助けることができるだけでなく

+0

、。しかし、ActiveDirectoryRealmを拡張しても、shiro.iniから読み込んだときに作成されたインスタンスを取得するにはどうすればよいですか?可能な解決策の1つは、ActiveDirectoryRealmをSingletonとして拡張した新しいクラスを作成することです。別の考えがありますか? はい:クエリiに既に存在するコンテキストを再利用したいです。 e。ユーザーの名前と電子メールアドレス。 –

+0

ありがとうございました! ADレルムを拡張することはやりました。私は、iniファイルを何らかの形で解析するときにインスタンスを作成する可能性があるはずだと考えましたが、可能性を見つけることができませんでした。私は今シングルトンアプローチを使用してそれを解決しました。私のADRealmのコンストラクタが呼び出されると、インスタンスを静的フィールドに保存します。クラスは現在、既存のLDAPコンテキストを使用してADからより多くの情報を取得します。 –

関連する問題