2013-05-15 3 views
1

Hi Iam new to Spring security,
Моя задача - аутентифицировать пользователя от активного каталога, сопоставляя имя пользователя, полученное из сертификата клиента x509. До сих пор, что я сделал включен SSL взаимная аутентификация x509 аутентификация с активным каталогом с использованием Spring security

Это выше часть работает отлично теперь у меня есть security.xml файл, в котором я настроил все связанные с ссылкой x509 и конфигурации службы каталогов Active Directory

 <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="[email protected]"/> 
<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="(&amp;(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 (подробности сертификат, используемый при входе), выходная строка для getPrincipal() является AnonymousUser и власти это дать, ROLE_ANONYMOUS но когда я называю getAuthentication.isAuthenticated() возвращает истинную. Я использую Tomcat 7, Spring Security 3.1
Что может быть проблема, пожалуйста, помогите мне в этом отношении

+0

Это ожидаемое поведение для пользователя, не прошедшего проверку подлинности. Вы подтвердили, что аутентификация действительно прошла успешно (например, путем изучения журнала отладки)? –

+0

Я включил ведение журнала сейчас, я мог видеть в журнале ** org.springframework.security.core.userdetails.UsernameNotFoundException: Пользователь Mohankumar Kanaka не найден в каталоге ** небольшой подсказку, мой предмет DN в сертификате примерно такой: * * CN = Mohankumar Kanaka, CN = Пользователи, DC = rvalidedc, DC = local **, где, поскольку активный каталог имеет имя входа в качестве **[email protected]**, это проблема? где есть дисплей для учетной записи mkanaka Mohankumar kanaka, я думаю, что это считается во время активного поиска каталогов? Спасибо за помощь Люк. – kanakmohank

ответ

0

С вашей конфигурации, имя пользователя, которое извлекается из сертификата будет «Mohankumar Канака», и это то, что весна Безопасность будет использоваться для аутентификации.

С вашей настройкой LDAP он будет искать запись в каталоге с соответствующим атрибутом sAMAccountName (которого он не найдет).

Вам понадобится способ сопоставления имени в сертификате с записью в Active Directory. Нет никакой возможности, которую Spring Security может сделать для вас автоматически. В идеале часть имени субъекта в сертификате должна соответствовать имени пользователя AD, чтобы вы могли легко извлечь его.

+0

Привет, Как мы можем проверить сертификат publickey, полученный из httpservletrequest с активным каталогом. Конфигурация приведена в весенней документации, обсуждая имя темы. пожалуйста, помогите мне в этом отношении – kanakmohank

+0

Извините, но у меня нет ничего другого, кроме того, что я уже писал. В вашем вопросе вам нужно будет объяснить, как подключены сертификаты и учетные записи AD. Если они не являются, то, очевидно, вы не можете подтвердить сертификат против AD. –

Смежные вопросы