Задача:
Реализовать в веб-приложении авторизацию с помощью Active Directory (для начала без применения различных ролей).
Решение:
Не буду описывать весь процесс прикручивания Spring Security к веб-приложению (о нем я уже когда-то писал тут), расскажу лишь о специфичных для LDAP моментах (в моем случае роль LDAP-сервера выполнял AD, но возможно, описанное здесь справедливо и для других серверов).
Во-первых, потребуются jar-ник Spring LDAP (http://www.springsource.org/ldap), а также модуль Spring Security "spring-security-ldap".
Для осуществления подключения к LDAP и аутентификации / авторизации через него потребутся следующие вещи:
- DN и пароль пользователя, от имени которого приложение будет выполнять запросы к LDAP (если AD не позволяет подключаться и искать пользователей анонимно)
- Собственно хост / порт LDAP-сервера
- BaseDN, т.е. тот контекст, который будет базовым для поиска пользователей
- Критерий, по которому мы будем соотносить введенный пользователем логин с объектом, соответствующим этому пользователю в 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).
Комментариев нет:
Отправить комментарий