Я разрабатываю портал для Liferay и хочу применить там механизм единого входа (SSO). Я использую Jasig CAS для централизованной аутентификации нескольких моих веб-приложений. До сих пор я знаю, что могу использовать CAS в качестве метода проверки подлинности, но следующим шагом будет добавление дополнительных сведений и запрос проверки подлинности с сервера Active Directory.
Это должно быть возможно при использовании AD в качестве "базы данных", для которой выполняется аутентификация, но я новичок в этих вещах и не знаю, как это сделать с помощью Jasig CAS.
Есть какие-нибудь подсказки, как выполнить эту задачу?
Ответ 1 · рейтинг 28 · John King
Я делаю здесь несколько предположений, поэтому, пожалуйста, дайте мне знать, если я ошибаюсь:
- Вы используете версию CAS от 3.3.2 до 3.4.8.
- Вы хотите связать CAS с Active Directory через LDAP (для Kerberos или SPNEGO см. Ссылки ниже) с помощью Bind LDAP Handler (для FastBind см. Ссылки ниже).
- Вы знакомы с созданием CAS из исходного кода через Maven.
Предпосылка
- Если вы собираетесь подключиться к AD через "ldaps: //" (в отличие от "ldap: //"), JVM на вашем сервере CAS должна доверять сертификату SSL вашего сервера Active Directory. Если вы используете самозаверяющий сертификат для AD, вам необходимо импортировать его в хранилище доверенных сертификатов JVM.
Резюме
В исходном дереве CAS вам необходимо внести изменения в следующие файлы:
- cas-server-webapp / pom.xml
- cas-server-webapp / SRC / основной / webapp / WEB-INF / deployerConfigContext.xml
Подробности
pom.xml:
Добавьте в <dependencies> следующее:
<!-- LDAP support -->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>cas-server-support-ldap</artifactId>
<version>${project.version}</version>
</dependency>
deployerConfigContext.xml:
Перенастройте свои устройства аутентификации:
- Look for:
<property name="authenticationHandlers">. Inside this is a <list>, and inside this are (probably) two <bean ...> elements
Оставьте это:
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient" />
Другой <bean> (опять же, вероятно) соответствует текущему методу аутентификации, который вы используете. (Я не понимаю, исходя из вопроса, поскольку существует несколько способов, которыми CAS может сделать это без использования внешних служб. По умолчанию используется SimpleTestUsernamePasswordAuthenticationHandler, это аутентифицируется, пока имя пользователя равно паролю). Замените <bean> на:
<!-- LDAP bind Authentication Handler -->
<bean class="org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler">
<property name="filter" value="uid=%u" />
<property name="searchBase" value="{your LDAP search path, e.g.: cn=users,dc=example,dc=com}" />
<property name="contextSource" ref="LDAPcontextSource" />
<property name="ignorePartialResultException" value="yes" /> <!-- fix because of how AD returns results -->
</bean>
Измените свойство searchBase в соответствии с конфигурацией AD.
Создайте источник контекста для LDAP:
Добавьте это где-нибудь в корневой элемент <beans>:
<bean id="LDAPcontextSource" class="org.springframework.ldap.core.support.LdapContextSource">
<property name="pooled" value="false"/>
<property name="urls">
<list>
<value>{URL of your AD server, e.g.: ldaps://ad.example.com}/</value>
</list>
</property>
<property name="userDn" value="{your account that has permission to bind to AD, e.g.: uid=someuser, dc=example, dc=com}"/>
<property name="password" value="{your password for bind}"/>
<property name="baseEnvironmentProperties">
<map>
<entry>
<key>
<value>java.naming.security.authentication</value>
</key>
<value>simple</value>
</entry>
</map>
</property>
</bean>
Измените "urls", "userDn" и "пароль" соответственно.
Перестройте cas-server-webapp и попробуйте.
Использованная литература