Jasig CAS — сервер аутентификации

в 15:17, , рубрики: single sign on, аутентификация, Веб-разработка, метки: ,

Если Вы разрабатываете веб-приложения, наверняка вы сталкивались с задачей реализации single sign on. В этой небольшой статье я кратко опишу готовое решение от Jasig.

Краткое описание

Jasig CAS (Central Authentication Service) — это веб-приложение, написанное на java. Чтобы начать им пользоваться, почти ничего не надо делать. Нужно загрузить, настроить, собрать, развернуть. И настроить клиентов (сайты на которых мы делаем single sign on).

Схема работы

Как работает CAS можно понять вот из этой диаграммы:

image

Аналогичную схему использует Яндекс и Гугл.

Рассмотрим её по шагам:

  • 1. Пользователь открывает веб-приложение.
  • 2. Запрос получает пока что не CAS, а приложение.
  • 3. Наше веб-приложение понимает, что у пользователя нету сессии и перенаправляет пользователя на CAS. Для пользователя всё просто — он открыл приложение и сразу увидел страницу логина.
  • 4. Пользователь вводит логин/пароль
  • 5. CAS их валидирует.
  • 6. И генерирует случайны набор символов — «тикет». В будущем он идентифицирует пользователя.
  • 7. Запрос перенаправляется на наше веб-приложение, тикет передается как параметр.
  • 8. Наше веб-приложение спрашивает у CAS есть ли пользователь с таким тикетом.
  • 9. Если есть, в ответ CAS отправляет логин пользователя и прочие данные (какие — зависит от того, как настроите).

Как настроить

Свой способ авторизации

Сначала нам нужно определить свою логику проверки имени пользователя и пароля. Для этого нам нужно переопределить класс org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler:

package mypack;
/**
 *
 * @author http://habrahabr.ru/users/nucleotide/
 */
public class MyAuthenticationHandler extends AbstractUsernamePasswordAuthenticationHandler {

 protected final boolean authenticateUsernamePasswordInternal( // true, если успешная аутенификация
        final UsernamePasswordCredentials credentials)
        throws AuthenticationException {

return credentials.getUsername().equals(credentials.getPassword());

} 
}

После этого нужно изменить конфигурацию контекста Spring, чтобы CAS знал, что надо использовать именно MyAuthenticationHandler.
Если вы мало знаете о Spring, то о нем можно поискать что-нибудь на хабре или почитать документацию на www.springsource.org.
В CAS основная настройка Spring, которая нам может понадобиться, лежит в файле deployerConfigContext.xml. Добавим наш класс:

. . . . .
<property name="authenticationHandlers">
			<list>
				<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
					p:httpClient-ref="httpClient" />
			
                <bean class="mypack.MyAuthenticationHandler">
                </bean>
			</list>
		</property>

. . . . .

Всё, что нам может понадобиться для логина (например dataSource), можно также заинжектить в контексте Spring:

. . . . .
<property name="authenticationHandlers">
			<list>
				<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
					p:httpClient-ref="httpClient" />
			
                <bean class="mypack.MyAuthenticationHandler">
<property name="dataSource" ref="dataSource"/>

                </bean>
			</list>
		</property>
. . . . .

Разворачивание

Для разворачивания понадобится сервер с установленной jvm и какой-либо СУБД. Даже если вы не используете СУБД для авторизации, CAS использует ее для хранения своих служебных таблиц.
В этих таблицах он хранит списки адресов, на которых возможна авторизация через этот сервер.
Например, если нам нужно авторизоваться на example.com через наш CAS, а его в списке нет, то авторизация будет неудачной (напомню: адрес сайта, на котором происходит логин передается в качестве параметра). Можно и вовсе не пользоваться никакими списками, разрешая авторизовываться с любыми адресам.

Как настроить клиента

У Jasic уже есть несколько готовых библиотек для работы с CAS (для java, .net и php). В случае Java — это готовые HTTP-фильтры, которые лишь необходимо настроить (о том, как это делается, можно прочесть тут: https://wiki.jasig.org/display/CASC/CAS+Client+for+Java+3.1).
Или же создать свой, унаследовав его от org.jasig.cas.client.util.AbstractCasFilter.


Все остальное — это уже доработка и настройка под свои нужды. По своему опыту могу сказать, что развертывание и доработка CAS это не очень сложный и долгий процесс. Можно привязать и каптчу, и статистику, дизайн конечно же.

Ссылки:
Взять можно на странице загрузок
Картинка взята отсюда:
Jasig: http://www.jasig.org/cas
Список порталов, где CAS уже используется: http://www.jasig.org/cas/deployments
Лицензия: http://www.jasig.org/cas/license

Автор: Nucleotide

* - обязательные к заполнению поля