4

認証用のプロバイダーとして外部LDAPを使用するweblogicサーバーがあります。LDAPリポジトリで特定のユーザーが関連付けたグループを回復する必要があります。

ログインは標準のJava表記を使用します。

<form method="POST" action="j_security_check">
<p>Username: <input type="text" name="j_username"/></p>
<p>Password: <input type="password" name="j_password"/></p>
<input type="submit" value="Login"/>
</form>

そして、ログイン後、次を使用してPrincialを回復できます:<%= request.getUserPrincipal()%>

しかし、今必要なのは、このプリンシパルに関連付けられているすべてのグループをLDAPから回復することです。出来ますか?

[] s

4

3 に答える 3

2

LDAPを使用しないと、すべてのグループのリストを取得できない場合があります。JAAS APIは通常、ユーザーが特定のグループに属しているかどうかを確認する方法を提供しますが、すべてのグループを一度に取得することはできません。

LDAPに直接アクセスせずに実行できる最善の方法は、次のようなものです。

for (String group : allGroups) { 
  if (request.isUserInRole(group)) { 
    userGroups.add(group);
  }
}

セッションの作成時に一度実行してから、userGroupsをセッションスコープにすると、パフォーマンスへの影響はそれほど悪くないはずです。(コンテナはログイン時にすべてのグループを取得する可能性があります。)

于 2011-08-15T01:50:53.210 に答える
1

多くの答えがあるかもしれません。考えられる答えの1つは、プリンシパルを使用してベースDNを構築し、スコープbase、フィルターを使用してディレクトリサーバーにクエリを実行し、属性'(&)'を要求することです。isMemberOfたとえば、最新のldapsearchコマンドラインツールと次のプリンシパルを使用する私のテストシステムではuser.0

ldapsearch --hostname localhost --port 1389 \
    --bindDN 'cn=directory manager' --baseDn \
    'uid=user.0,ou=people,dc=example,dc=com' \
    --searchScope base '(&)' isMemberOf
Password for user 'cn=directory manager':
dn: uid=user.0,ou=people,dc=example,dc=com
isMemberOf: cn=shadow entries,ou=groups,dc=example,dc=com
isMemberOf: cn=persons,ou=groups,dc=example,dc=com

namingContextこの方法では、、この場合dc=example,dc=comは、ユーザーがツリーのどこにいるかについての知識が必要です。ユーザーの場所がわからない場合の別の同様の方法は、最初にユーザーを検索し、次に検索結果から識別された名前を使用して上記のクエリを実行することです。が不明な場合は、ルートDSEからnamingContextを検出できる可能性があります。ルートDSEからnamingContextを回復するには、この記事を参照してください。namingContext

LDAP標準を正しくサポートしておらず、フィルターを拒否する、広く使用されているディレクトリサーバーがいくつかあり'(&)'ます。ディレクトリサーバーがこれらのいずれかである場合は、単にプレゼンスフィルターに置き換えてください'(objectClass=*)'。Java用のLDAPSDKはたくさんありますが、私が好むのはUnboundIDのものです。

于 2011-08-05T00:21:42.440 に答える
1

私も同じ問題を抱えていました。グーグルで見て、私はこれを見つけました:http: //buttso.blogspot.com/2011/06/weblogic-server-listing-groups-of.html

これがお役に立てば幸いです。

于 2013-08-26T23:48:25.977 に答える