Если Вы разрабатываете веб-приложения, наверняка вы сталкивались с задачей реализации single sign on. В этой небольшой статье я кратко опишу готовое решение от Jasig.
Краткое описание
Jasig CAS (Central Authentication Service) — это веб-приложение, написанное на java. Чтобы начать им пользоваться, почти ничего не надо делать. Нужно загрузить, настроить, собрать, развернуть. И настроить клиентов (сайты на которых мы делаем single sign on).
Схема работы
Как работает CAS можно понять вот из этой диаграммы:
Аналогичную схему использует Яндекс и Гугл.
Рассмотрим её по шагам:
- 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