ShibbolethでAnonymous bindが出来ない件

LDAPを使っている人の中にはAnonymous bindでユーザ情報を取得出来るようにしてる人もいて,まぁLDAPが使えるShibbolethもコネクタの設定次第ではできるだろうと思い試してみた.結果は,設定はできるけどLDAPへのbindはAnonymousにならないということになった(LDAPに詳しくないので穴があるやも).
一番の問題は,この辺りの細かい所がInternet2のWikiだとアンドキュメントな所なんだよね.

LdapDataConnector.javaを見れば分かるけど,ちゃんと認証タイプのenumの中にANONYMOUSがあるので,これを設定で使えるようにする.shibboleth-2.0-attribute-resolver-dc.xsdを見て,その規則に合わせて書く.

<resolver:DataConnector id="myLDAP" xsi:type="LDAPDirectory"
                xmlns="urn:mace:shibboleth:2.0:resolver:dc"
                ldapURL="ldap://test.example.ac.jp"
                baseDN="ou=test,o=example,dc=ac,dc=jp"
                authenticationType="ANONYMOUS">
  <FilterTemplate>
    <![CDATA[
      (eppn=$requestContext.principalName)
    ]]>
  </FilterTemplate>
</resolver:DataConnector>

JavaenumはvalueOfによって値を取得するので,上記のように書く.この辺りはShibboleth commonライブラリのconfigパッケージにあるLdapDataConnectorBeanDefinitionParser.javaのdoParseを参照.注意点としては,これはShibboleth 2.1.xでないと動きません.なぜなら,Shibboleth 2.0にバンドルされているShibboleth common 1.0ではxsdは同じでもauthenticationType属性のパースが実装されていないため,起動時にエラーになるという罠が*1

  • アクセスする

認証方式をJAASにしてアクセスしてOpenLDAPのログを見ると,見事に属性取得時もユーザbindされている.まあここは認証したユーザ情報をIdPが保持しているので,次のアクセスでAnonymousから変わるのは仕方ないといえば仕方ないのかもしれない.ということで,同一サーバでは無理っぽいので認証LDAPと属性LDAPを分ければ出来そうかなぁと思うんだけど,その時はprincipalNameはどうなるの?という疑問が.もうちょい勉強が必要か…ソースとか読んでるとあまり関係なかった(Subject辺りがあれだけど).下の解決?参照

追記

いや,principalNameは認証が通っていればどうとでもなるな.やっぱりAnonymousにならない理由が分からない.どこか設定おかしいのかなぁ?

解決?

OpenLDAPJavaが吐いてるログを見比べたら分かった.Java側はAnonymous bind(LDAPのライブラリとしてはnone)としてアクセスしてるけど,OpenLDAP側はAnonymous bindと認識してなかっただけのようだ(原因が分からない).LDAPのコネクトに使っているvt-ldapは内部でjava.naming.security.authenticationを使っていてnoneはAnonymous bindのはずなのだが(FilterTemplateが駄目なのか?).
誰かJavaLDAPに詳しい人ヘルプ!

*1:公式のダウンロードからは1.0がソースで落とせなくて長いことはまったw