Представьте, что у вас есть web-проект, который состоит из двух или более частей, (part1.example.com) и вторая часть (part2.example.com). Теперь перед вам стоит задача сделать Аутентификацию пользователя, но так чтобы когда пользователь зайдя один раз в любую из частей web-проекта, например, в первую, то во второй он уже должен быть аутентифицирован.
Процесс такой Аутентификацию пользователя называют Технология единого входа или SSO (Single Sign-On).
На Хабре уже есть подобная статья Jasig CAS — сервер аутентификации, но она немного устарела так как там используется CAS Server 3.* и на мое мнение она не достаточно детально изложена для людей которые впервые пытаются реализовать SSO используя Jasig CAS (Central Authentication Service), но теория там довольно хорошо описана, поэтому рекомендую также просмотреть.
Обратите внимание, что мы будем конфигурировать Jasig CAS Server который будет аутентифицировать пользователя и отдавать web-клиентам. В дальнейшем планирую написать о реализации клиента для этого сервера.
Создание Maven проекта и добавление зависимостей
Так как это туториал буду все по порядку объяснять.
Создайте простой Maven проект и в pom.xml добавьте следующие зависимости:
<properties>
<cas.version>4.0.0</cas.version>
</properties>
<dependencies>
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-webapp</artifactId>
<version>${cas.version}</version>
<type>war</type>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-support-generic</artifactId>
<version>${cas.version}</version>
<type>jar</type>
</dependency>
</dependencies>
cas-server-webapp — это стандартый сервер, который мы будем позже конфигурировать под себя;
cas-server-support-generic — а эта библиотека нам и позволит конфигурировать сервер под себя.
А также подключим плагин сборки:
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<warName>cas</warName>
</configuration>
</plugin>
Он позволит собрать наш проект с контекстом /cas
.
После того как Maven скачает CAS у вас в проекте появится новая папка в которой уже будет сборка сервера CAS 4.0.0 по умолчанию.
Теперь можно будет задеплоить и запустить, но прежде нам нужно выполнить небольшую конфигурацию Tomcat так как деплоить мы будем на него.
Конфигурация Tomcat и генерация ключей
Я не хочу повторяться, поэтому укажу ссылку на более детальное описание тому материалу, что будет ниже вот ссылка на описание.
Первым делом нужно сгенерировать сертификат и зарегистрировать его, для этого будем использовать стандартный keytool который есть в каждом JDK.
1. Генерируем Java Key Store:
keytool -genkey -alias casdc -keypass 12345678 -keystore ssoServer.jks -storepass 12345678 -validity 365
2. Теперь создаем на основании уже сгененированого хранилища сертификат:
keytool -export -alias casdc -file casServerPublic.cer -keystore ssoServer.jks -storepass 12345678
3. И полученый сертификат импортируем в хранилище довереных сертификатов:
keytool -import -alias casdc -file casServerPublic.cer -keypass 12345678 -keystore "C:/Program Files/Java/jdk1.7.0/jre/lib/security/cacerts" -storepass changeit
После этого заходим в папку ./apache-tomcat-8.0.9/conf и открываем на редактирование файл server.xml находим там строку: Define a SSL HTTP/1.1 Connector on port 8443
и после этой строки, по умолчанию это примерно 83 строка, вставляем следующий фрахмет xml:
<Connector port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
clientAuth="false"
sslProtocol="TLS"
keyAlias="casdc"
keystoreFile="C:/keys/ssoServer.jks"
keystorePass="12345678" />
Обратите внимание что сгенерированное хранилище ssoServer.jks я поместил в папку C:/keys/ssoServer.jks и после указал к нему полный путь.
keyAlias — это алиас, который мы указывали на первом шаге генерации хранилища.
keystorePass — пароль к нашему хранилищу ключей.
Таким образом мы сконфигурировали HTTPS, который так необходимый CAS серверу.
После этого можна запустить Tomcat и заделоить наш проект.
После перейдите по ссылке: https://localhost:8443/cas/ — это cas сервер со стандартной конфигурацией.
Вы должны увидеть следующее:
Если у вас появляется красная полоска с тестом, то это значит что вы сделали что-то не так, и HTTPS не включен.
И для того чтобы проверить что CAS сервер удачно запустился и работает, давайте залогинимся. Для этого вам нужно ввести стандартные логин и пароль:
Логин: casuser
Пароль: Mellon
После удачного входа вы должны увидеть:
Поздравляю CAS сервер мы запустили. В следующем посте я расскажу как кастомизировать AuthenticationHandler, а именно возможность получения пользователя с БД или другой внешней системы.
Строго не судите, это мой первый прототип на данную тематику, и если будут замечания, с радостью выслушаю. Также я его постоянно улучшаю и о новых достижениях буду писать, конечно же если это будет кому-то интересно.
Исходники проекта на Github: https://github.com/alexbarchuk/local-cas
Источник: https://wiki.jasig.org/display/CASUM/Configuring
Автор: Devcolibri