- PVSM.RU - https://www.pvsm.ru -

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

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

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

Jasig CAS [3] (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, то о нем можно поискать что-нибудь на хабре [4] или почитать документацию на www.springsource.org [5].
В 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 [6]).
Или же создать свой, унаследовав его от org.jasig.cas.client.util.AbstractCasFilter.


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

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

Автор: Nucleotide


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/veb-razrabotka/12195

Ссылки в тексте:

[1] single sign on.: http://en.wikipedia.org/wiki/Single_sign-on

[2] Jasig: http://www.jasig.org/

[3] Jasig CAS: http://Jasig CAS

[4] что-нибудь на хабре: http://habrahabr.ru/search/?q=spring

[5] www.springsource.org: http://www.springsource.org

[6] https://wiki.jasig.org/display/CASC/CAS+Client+for+Java+3.1: https://wiki.jasig.org/display/CASC/CAS+Client+for+Java+3.1

[7] странице загрузок: http://www.jasig.org/cas/download

[8] http://www.jasig.org/cas: http://www.jasig.org/cas

[9] http://www.jasig.org/cas/deployments: http://www.jasig.org/cas/deployments

[10] http://www.jasig.org/cas/license: http://www.jasig.org/cas/license