こんにちは、Spring セキュリティ
の初心者です。私の仕事は、x509 クライアント証明書から取得したユーザー名を照合して、Active Directory に対してユーザーを認証することです。これまでのところ、ssl相互認証を有効にしました
上記の部分は正常に機能しており、x509 参照と Active Directory 構成に関連するすべてを構成した security.xml ファイルがあります。
<global-method-security secured-annotations="enabled" />
<http >
<intercept-url pattern="/**" access="ROLE_USER,ROLE_ANONYMOUS" requires- channel="https"/>
<intercept-url pattern="/UserLogin/*" access="ROLE_ADMIN,ROLE_USER" requires-channel="https"/>
<x509 subject-principal-regex="CN=(.*?)," user-service-ref="ldapUserService" />
</http>
<authentication-manager>
<authentication-provider user-service-ref="ldapUserService" />
</authentication-manager>
<bean:bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<bean:constructor-arg value="ldap://ActiveDirectoryURL:389/CN=example,DC=net"/>
<bean:property name="userDn" value="mkanaka@example.local"/>
<bean:property name="password" value="secuera1SMK"/>
</bean:bean>
<bean:bean name="ldapUserService" class="org.springframework.security.ldap.userdetails.LdapUserDetailsService">
<bean:constructor-arg ref="ldapUserSearch"/>
<bean:constructor-arg ref="ldapAuthoritiesPopulator"/>
</bean:bean>
<bean:bean name="ldapUserSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
<bean:constructor-arg value=""/>
<bean:constructor-arg value="(&(sAMAccountName={0})(objectclass=Users))"/>
<bean:constructor-arg ref="contextSource" />
</bean:bean>
<bean:bean name="ldapAuthoritiesPopulator"
class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
<bean:constructor-arg ref="contextSource" />
<bean:constructor-arg value="" />
<bean:property name="groupSearchFilter" value="member={0}" />
<bean:property name="searchSubtree" value="true" />
</bean:bean>
今私が直面している問題は、SecurityContextHolder.getContext().getAuthentication().getPrincipal(); を取得しようとしたときです。戻り値の型はuserDetails (ロギング中に使用される証明書の詳細) ではなく文字列です。私はTomcat 7、Spring security 3.1を使用して
います。何が問題なのか、この点で私を助けてください