barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 1 июня 2012 г.

Spring Security: аутентификация и авторизация с помощью Active Directory

Задача:

Реализовать в веб-приложении авторизацию с помощью Active Directory (для начала без применения различных ролей).

Решение:

Не буду описывать весь процесс прикручивания Spring Security к веб-приложению (о нем я уже когда-то писал тут), расскажу лишь о специфичных для LDAP моментах (в моем случае роль LDAP-сервера выполнял AD, но возможно, описанное здесь справедливо и для других серверов).
Во-первых, потребуются jar-ник Spring LDAP (http://www.springsource.org/ldap), а также модуль Spring Security "spring-security-ldap". 
Для осуществления подключения к LDAP и аутентификации / авторизации через него потребутся следующие вещи:
  1. DN и пароль пользователя, от имени которого приложение будет выполнять запросы к LDAP (если AD не позволяет подключаться и искать пользователей анонимно)
  2. Собственно хост / порт LDAP-сервера
  3. BaseDN, т.е. тот контекст, который будет базовым для поиска пользователей
  4. Критерий, по которому мы будем соотносить введенный пользователем логин с объектом, соответствующим этому пользователю в LDAP. Например, роль логина может выполнять электронная почта пользователя или его UID, как в моем случае.
В конфигурации Spring Security необходимо объявить соответствующий провайдер аутентификации и инициализировать необходимые для него бины:
<beans:bean id="contextSource"
class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
  <beans:constructor-arg value="ldap://myldap:389/dc=barbitoff,dc=blogspot,dc=com"/>
  <!--beans:property name="userDn" value="uid=barbitoff,ou=People,dc=barbitoff,dc=blogspot,dc=com"/>
  <beans:property name="password" value="barbitoffspass"/-->
</beans:bean>  
<beans:bean id="ldapActiveDirectoryAuthProvider"
class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
  <beans:constructor-arg>
<beans:bean class="org.springframework.security.ldap.authentication.BindAuthenticator">
 <beans:constructor-arg ref="contextSource"/>
 <beans:property name="userDnPatterns">
<beans:list>
 <beans:value>uid={0},ou=People</beans:value>
</beans:list>
 </beans:property>
</beans:bean>
  </beans:constructor-arg>
  <beans:constructor-arg>
<beans:bean class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
 <beans:constructor-arg ref="contextSource"/>
 <beans:constructor-arg value="ou=Groups"/>
 <beans:property name="groupRoleAttribute" value="ou"/>
</beans:bean>
  </beans:constructor-arg>
</beans:bean>      
<authentication-manager erase-credentials="true">
<authentication-provider ref="ldapActiveDirectoryAuthProvider"/>
</authentication-manager>   
Сконфигурированный таким образом Spring Security будет пытаться аутентифицировать  в LDAP пользователя, используя DN "uid=<entered-login>,ou=People,dc=barbitoff,dc=blogspot,dc=com", где <entered-login> - введенный пользователем в форму входа логин. При успешной аутентификации список ролей пользователя будет заполняться на основе результата поиска в ou=Groups,dc=barbitoff,dc=blogspot,dc=com с фильтром "member=<userDN>" (имя роли будет браться из атрибута "ou").
Закомментированные строки в бине "contextSource" нужно раскомментировать, если поиск пользователей невозможен при анонимном подключении к LDAP. 
Для отладки конфигурации очень полезно включить логирование на уровень DEBUG (http://barbitoff.blogspot.com/2012/05/spring-security.html). 

Комментариев нет:

Отправить комментарий