чтение урожая
✔️1.Понять принцип единого входа
✔️2. Освойте быстрое использование xxl-sso для доступа к функции единого входа.
1. Ранние решения для мультисистемного входа
- Основой единого решения для входа в систему является файл cookie, который содержит идентификатор сеанса для поддержания состояния сеанса между браузером и сервером. Но файлы cookie имеют ограничения. Это ограничение — домен файла cookie (обычно соответствующий доменному имени веб-сайта). Когда браузер отправляет HTTP-запрос, он автоматически передает файл cookie, соответствующий домену, а не все файлы cookie.
- В таком случае, почему бы не объединить доменные имена всех подсистем в группе веб-приложений под одним доменным именем верхнего уровня, например «*.baidu.com», а затем установить для их домена cookie значение «baidu.com». теоретический подход Да, даже в первые дни многие мультисистемные входы использовали этот метод совместного использования файлов cookie с одним и тем же доменным именем.
- Существует ряд ограничений на способ обмена файлами cookie.
-
- Доменное имя группы приложений должно быть единым
-
- Технология (по крайней мере, веб-сервер), используемая каждой системой группы приложений, должна быть одинаковой, в противном случае значение ключа файла cookie (tomcat — JSESSIONID) отличается, и сеанс не может поддерживаться. , между системами .net
-
- Файлы cookie не являются безопасными по своей сути.
-
- Поэтому нам нужен новый метод входа в систему для входа в группу приложений с несколькими системами, который является единым входом.
2. Что такое единый вход
-
Полное английское название единого входа — Single Sign On, или сокращенно SSO.
-
Относится к входу в одну систему в многосистемной группе приложений, вы можете авторизоваться во всех других системах без повторного входа в систему, включая единый вход и единый выход.
3. Зачем вам нужен единый вход?
- Веб-система уже давно превратилась из одной системы в группу приложений, состоящую из нескольких систем.Столкнувшись с таким количеством систем, должны ли пользователи входить в систему по одной, а затем выходить из системы по одной?
- Веб-система превратилась из одной системы в группу приложений, состоящую из нескольких систем, и сложность должна нести система, а не пользователь. Независимо от того, насколько сложна веб-система, она представляет собой единое целое для пользователей, то есть пользователи, получающие доступ ко всей группе приложений веб-системы, аналогичны доступу к одной системе, и достаточно один раз войти/выйти из системы.
В-четвертых, принцип единого входа
4.1 Вход
Для единого входа требуется независимый центр аутентификации. Только центр аутентификации может принимать имя пользователя, пароль и другую информацию о безопасности. Другие системы не предоставляют вход в систему и принимают только непрямую авторизацию из центра аутентификации.
Косвенная авторизация достигается с помощью токенов. Центр аутентификации sso без проблем проверяет имя пользователя и пароль пользователя, создает токен авторизации. В процессе следующего перехода токен авторизации отправляется в качестве параметра каждой подсистеме, и подсистема получает токен. , то есть авторизованный, вы можете использовать его для создания локального сеанса, а метод входа в локальный сеанс такой же, как и в одиночной системе.
Этот процесс, являющийся принципом единого входа, показан на следующем рисунке.
- Пользователь обращается к защищенным ресурсам системы 1, а система 1 обнаруживает, что пользователь не авторизован, переходит к центру аутентификации sso и использует в качестве параметра собственный адрес
- Центр аутентификации sso обнаруживает, что пользователь не вошел в систему, и направляет пользователя на страницу входа (с адресом системы 1).
- Пользователь вводит имя пользователя и пароль для подачи заявки на вход
sso认证中心校验用户信息,创建用户与sso认证中心之间的会话,称为全局会话(这时该会话信息保存到cookie中),同时创建授权令牌
- Центр аутентификации SSO переходит к исходному адресу запроса с токеном (система 1).
- Система 1 получает токен и обращается в центр аутентификации sso, чтобы проверить, действителен ли токен.
- Центр аутентификации SSO проверяет токен, возвращает действительный и регистрирует систему 1.
系统1使用该令牌创建与用户的会话,称为局部会话(seesion),返回受保护资源
- Доступ пользователей к защищенным ресурсам Системы 2
- Система 2 обнаруживает, что пользователь не вошел в систему, переходит к центру аутентификации sso и отправляет собственное сообщение.
地址
и до иsso认证中心的会话cookie信
информация как параметр - Центр аутентификации sso обнаруживает, что пользователь вошел в систему, возвращается к адресу системы 2 и прикрепляет токен.
- Система 2 получает токен и обращается в центр аутентификации sso, чтобы проверить, действителен ли токен.
- Центр аутентификации sso проверяет токен, возвращает действительный и регистрирует систему 2.
- Система 2 использует токен для создания частичного сеанса с пользователем, возвращая защищенный ресурс.
После успешного входа пользователя в систему будет установлен сеанс с центром аутентификации sso и доступными подсистемами.Сеанс, установленный между пользователем и центром аутентификации sso, называется глобальным сеансом, а сеанс, установленный между пользователем и каждой подсистемой, называется локальным сеансом.После установления локального сеанса доступ пользователя к защищенным ресурсам подсистемы больше не будет проходить через центр аутентификации sso.Глобальный сеанс и локальный сеанс имеют следующие ограничения
- Локальный сеанс существует, глобальный сеанс должен существовать
- Глобальная сессия существует, но локальная сессия не обязательно существует
- Глобальная сессия уничтожена, локальная сессия должна быть уничтожена
4.2 Выход
В подсистеме выхода из системы все подсистемы будут уничтожены, со следующим рисунком ниже
Центр аутентификации SSO контролировал состояние глобальной сессии. После уничтожения глобальной сессии слушатель уведомляет всех зарегистрированных систем для выполнения операции выхода из системы.
Ниже приводится краткое описание приведенного выше рисунка.
- Пользователь инициирует запрос на выход из системы 1.
- Система 1 получает токен в соответствии с идентификатором сеанса, установленным пользователем и системой 1, и инициирует запрос на выход из системы в центр аутентификации sso.
- Центр аутентификации sso проверяет допустимость токена, уничтожает глобальный сеанс и удаляет все системные адреса, зарегистрированные с этим токеном.
- Центр сертификации SSO инициирует запрос на выход из системы во все системы регистрации.
- Каждая система регистрации получает запрос на выход из центра аутентификации sso и уничтожает локальную сессию.
- Центр аутентификации SSO направляет пользователя на страницу входа.
5. Быстрый доступ к SSO
5.1 Особенности xxl-sso
-
- Краткость: API интуитивно понятен и лаконичен, и вы можете быстро приступить к работе.
-
- Легкий: небольшие зависимости от среды, низкие затраты на развертывание и доступ.
-
- Единый вход: нужно войти в систему только один раз, чтобы получить доступ ко всем взаимно доверенным системам приложений.
-
- Распределенные: приложения, которые обращаются к центру аутентификации SSO, поддерживающие распределенное развертывание.
-
- Высокая доступность: и сервер, и клиент поддерживают развертывание кластера для повышения доступности системы.
-
- Междоменный: поддержка междоменных приложений для доступа к центру аутентификации SSO.
-
- Поддерживаются как Cookie+Token: поддерживаются методы доступа на основе Cookie и Token, и оба предоставляют примеры проектов.
-
- Поддержка как Web + APP: поддержка доступа через Интернет и APP
-
- В режиме реального времени: состояние входа и выхода из системы, все серверы и клиенты передаются в режиме реального времени.
-
- Структура CS: Основана на структуре CS, включая серверный «центр сертификации» и клиентское «защищенное приложение».
-
- Запомните пароль: если вы не помните пароль, закрытие браузера аннулирует состояние входа в систему, когда вы помните пароль, состояние входа автоматически продлевается На основе пользовательского времени продления, в принципе, его можно продлить на неопределенный срок.
-
- Исключение пути: поддерживает настраиваемые множественные пути исключения, поддерживает выражения Ant и используется для исключения путей, которые клиентам SSO не нужно фильтровать.
5.2 Окружающая среда
- JDK: 1.7+
- Редис: 4.0+
5.3 Загрузите исходный код xxl-sso
Адрес склада исходного кода | Release Download |
---|---|
GitHub.com/Сюэли Сюй/Спасибо... | Download |
git ee.com/xueli 0323… | Download |
5.4 Адрес документа
5.5 Описание структуры проекта
- xxl-sso-server:中央认证服务,支持集群
- xxl-sso-core:Client端依赖
- xxl-sso-samples:单点登陆Client端接入示例项目
- xxl-sso-web-sample-springboot:基于Cookie接入方式,供用户浏览器访问,springboot版本
- xxl-sso-token-sample-springboot:基于Token接入方式,常用于无法使用Cookie的场景使用,如APP、Cookie被禁用等,springboot版本
5.6 Развертывание на основе токена
- Поскольку существует множество режимов отдельной разработки между интерфейсом и сервером, здесь представлено только развертывание на основе токена. В некоторых сценариях, когда нельзя использовать файлы cookie, можно использовать этот метод. Если вам нужны файлы cookie для просмотраРазвернуть на основе cookie
5.6.1 Создание центра аутентификации (SSO-сервера)
- Название проекта: xxl-sso-сервер
- Расположение файла конфигурации: application.properties
### redis 地址: 如 "{ip}"、"{ip}:{port}"、"{redis/rediss}://xxl-sso:{password}@{ip}:{port:6379}/{db}";多地址逗号分隔
xxl.sso.redis.address=redis://127.0.0.1:6379
### 登录态有效期窗口,默认24H,当登录态有效期窗口过半时,自动顺延一个周期
xxl.sso.redis.expire.minute=1440
5.6.2 Конструкция клиента единого входа
-
Название проекта: xxl-sso-token-sample-springboot
-
maven-зависимости
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-sso-core</artifactId>
<version>${最新稳定版}</version>
</dependency>
- Файл конфигурации: application.properties
##### SSO Server认证中心地址(推荐以域名方式配置认证中心)
xxl.sso.server=http://xxlssoserver.com:8080/xxl-sso-server
##### 注销登陆path,值为Client端应用的相对路径
xxl.sso.logout.path=/logout
##### 路径排除Path,允许设置多个,且支持Ant表达式。用于排除SSO客户端不需要过滤的路径
xxl-sso.excluded.paths=
### redis // redis address, like "{ip}"、"{ip}:{port}"、"{redis/rediss}://xxl-sso:{password}@{ip}:{port:6379}/{db}";Multiple "," separated
xxl.sso.redis.address=redis://xxl-sso:password@127.0.0.1:6379/0
xxl.sso.redis.address=redis://127.0.0.1:6379
- Настройка XxlSsoTokenFilter
package com.xxl.sso.sample.config;
import com.xxl.sso.core.conf.Conf;
import com.xxl.sso.core.filter.XxlSsoTokenFilter;
import com.xxl.sso.core.util.JedisUtil;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author xuxueli 2018-11-15
*/
@Configuration
public class XxlSsoConfig implements DisposableBean {
@Value("${xxl.sso.server}")
private String xxlSsoServer;
@Value("${xxl.sso.logout.path}")
private String xxlSsoLogoutPath;
@Value("${xxl.sso.redis.address}")
private String xxlSsoRedisAddress;
@Value("${xxl-sso.excluded.paths}")
private String xxlSsoExcludedPaths;
@Bean
public FilterRegistrationBean xxlSsoFilterRegistration() {
// xxl-sso, redis init
JedisUtil.init(xxlSsoRedisAddress);
// xxl-sso, filter init
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setName("XxlSsoWebFilter");
registration.setOrder(1);
registration.addUrlPatterns("/*");
//token使用的是XxlSsoTokenFilter
registration.setFilter(new XxlSsoTokenFilter());
registration.addInitParameter(Conf.SSO_SERVER, xxlSsoServer);
registration.addInitParameter(Conf.SSO_LOGOUT_PATH, xxlSsoLogoutPath);
registration.addInitParameter(Conf.SSO_EXCLUDED_PATHS, xxlSsoExcludedPaths);
return registration;
}
@Override
public void destroy() throws Exception {
// xxl-sso, redis close
JedisUtil.close();
}
}
5.6.3 Аутентификация (метод токена запроса моделирования для доступа к интерфейсу единого входа)
- Измените файл хоста: получите доступ к центру аутентификации по доменному имени, смоделируйте междоменную и реальную онлайн-среду.
### 在host文件中添加以下内容0
127.0.0.1 xxlssoserver.com
127.0.0.1 xxlssoclient1.com
127.0.0.1 xxlssoclient2.com
-
Запустите «xxl-sso-server» и «xxl-sso-token-sample-springboot» соответственно.
-
После успешного создания центра аутентификации для входа в систему с помощью токена предоставляется интерфейс API по умолчанию:
-
1. Интерфейс входа: /app/login
- Параметры: POST-параметры
- имя пользователя: номер счета
- пароль: учетная запись
- Ответ: формат JSON
- код: 200 означает успех, другие неудачи
- сообщение: сообщение об ошибке
- data: sso sessionid вошедшего в систему пользователя
- Параметры: POST-параметры
-
2. Интерфейс выхода: /app/logout
- Параметры: POST-параметры
- sessionId: sso sessionid вошедшего в систему пользователя
- Ответ: формат JSON
- код: 200 означает успех, другие неудачи
- сообщение: сообщение об ошибке
- Параметры: POST-параметры
-
3. Интерфейс проверки статуса входа: /app/logincheck
- Параметры: POST-параметры
- sessionId: sso sessionid вошедшего в систему пользователя
- Ответ: формат JSON
- код: 200 означает успех, другие неудачи
- сообщение: сообщение об ошибке
- данные: информация о пользователе для входа
- идентификатор пользователя: идентификатор пользователя
- имя пользователя: имя пользователя
- Параметры: POST-параметры
-
Тест http-клиента IDEA выглядит следующим образом:
##client1
POST http://xxlssoclient1.com:8082/xxl-sso-token-sample-springboot/
Content-Type: application/x-www-form-urlencoded
xxl_sso_sessionid: 1000_bac4555c627e4233b6da7d3f9b91aff5
###
##client2
http://xxlssoclient2.com:8082/xxl-sso-token-sample-springboot/
Content-Type: application/x-www-form-urlencoded
xxl_sso_sessionid: 1000_bac4555c627e4233b6da7d3f9b91aff5
###
##校验
POST http://xxlssoserver.com:8080/xxl-sso-server/app/logincheck
Content-Type: application/x-www-form-urlencoded
sessionId=1000_9df8ee645d7f435fb5f76c9223dfe6e8
###
##注销
POST http://xxlssoserver.com:8080/xxl-sso-server/app/logout
Content-Type: application/x-www-form-urlencoded
sessionId=1000_0ec8e28158da4241926314e0b3b9b834
###
#登录sso
POST http://xxlssoserver.com:8080/xxl-sso-server/app/login
Content-Type: application/x-www-form-urlencoded
username=user&password=123456
- Проверка процесса входа/выхода из системы единого входа:
- Обратитесь к тестовому примеру: com.xxl.app.sample.test.TokenClientTest
- Обычно процесс входа в систему выглядит следующим образом:
- 1. После получения пароля учетной записи, введенного пользователем, запросите интерфейс входа в систему сервера SSO для получения идентификатора сеанса sso пользователя (код ссылки: TokenClientTest.loginTest).
- 2. После успешного входа в систему получается sso sessionid, который необходимо активно хранить и устанавливать в параметре Header для последующих запросов.
- 3. На этом этапе используйте sso sessionid для доступа к интерфейсам, предоставляемым защищенным «приложением Client01» и «приложением Client02», и интерфейсы возвращаются нормально (код ссылки: TokenClientTest.clientApiRequestTest)
- Обычно процесс выхода выглядит следующим образом:
- 1. Запросите интерфейс выхода из системы SSO Server и выйдите из системы с учетными данными для входа в систему sso sessionid (код ссылки: TokenClientTest.logoutTest).
- 2. После успешного выхода сеанс sso становится недействительным во всем мире.
- 3. На этом этапе используйте sso sessionid для доступа к интерфейсам, предоставляемым защищенным «приложением Client01» и «приложением Client02». Запрос интерфейса будет перехвачен, с сообщением о том, что вы не вошли в систему, и возвратом кода состояния 501 (код ссылки: TokenClientTest.clientApiRequestTest )
6. Общий дизайн
6.1 Схема архитектуры
6.2 Функциональное расположение
XXL-SSO — это распределенная система единого входа. Вам нужно войти в систему только один раз, чтобы получить доступ ко всем взаимно доверенным системам приложений.
С помощью XXL-SSO можно быстро реализовать единый вход в распределенную систему.
6.3 Основные концепции
концепция | инструкция |
---|---|
SSO Server | Центральная служба аутентификации, поддерживающая кластеры |
SSO Client | Клиентское приложение, обращающееся к центру аутентификации SSO |
SSO SessionId | Идентификатор сеанса пользователя при входе в систему, успешный вход в систему SSO автоматически назначается пользователю |
SSO User | Информация о пользователе для входа в систему, соответствующая SSO SessionId |
6.4 Анализ процесса входа в систему
- Когда пользователь получает доступ к ограниченным ресурсам в клиентском приложении, он будет автоматически перенаправлен на сервер SSO для входа в единый интерфейс входа в систему.
- После того, как пользователь успешно войдет в систему, идентификатор сеанса единого входа будет назначен пользователю и перенаправлен обратно в исходное клиентское приложение с назначенным идентификатором сеанса единого входа.
- Убедитесь, что идентификатор сеанса единого входа указан правильно в фильтре единого входа на стороне клиента, и запишите идентификатор сеанса единого входа в файл cookie под именем домена на стороне клиента браузера пользователя.
- Фильтр SSO проверяет, что SSO SessionId передан, и запрос ограниченного ресурса освобождается.
6.5 Анализ процесса выхода из системы
- Когда пользователь и клиентское приложение запрашивают выход из Path, они будут перенаправлены на сервер SSO для автоматического уничтожения глобального SSO SessionId для достижения глобального уничтожения.
- Затем при доступе к любому клиентскому приложению, защищенному единым входом, фильтр единого входа перехватит запрос и перенаправит его на единый интерфейс входа сервера единого входа.
6.6 Связанные понятия на основе файлов cookie
- Хранилище учетных данных для входа: после успешного входа в систему учетные данные пользователя автоматически сохраняются в файле cookie браузера.
- Клиентская сторона проверяет статус входа в систему: судя по проверке того, содержит ли файл cookie запроса учетные данные пользователя для входа в систему.
- Ролевая модель системы:
-
Сервер SSO: центр аутентификации, обеспечивающий такие функции, как вход пользователя в систему, выход из нее и проверка статуса входа.
-
Клиентское приложение: веб-приложение на стороне клиента, защищенное единым входом, предоставляющее услуги для доступа пользователей через браузер.
-
Пользователь: пользователь, который инициирует запрос, используя браузер для доступа
-
6.7 На основе токена, связанных концепций
- Хранилище учетных данных для входа: после успешного входа в систему получаются учетные данные для входа (xxl_sso_sessionid=xxx), которые необходимо активно хранить, например, в localStorage, Sqlite.
- Клиентская сторона проверяет статус входа в систему: проверяя, содержит ли параметр заголовка запроса учетные данные пользователя для входа (xxl_sso_sessionid=xxx); поэтому учетные данные для входа необходимо установить в параметре заголовка при отправке запроса.
- Ролевая модель системы:
- Сервер SSO: центр аутентификации, обеспечивающий такие функции, как вход пользователя в систему, выход из нее и проверка статуса входа.
- Клиентское приложение: веб-приложение на стороне клиента, защищенное единым входом, предоставляющее сервисы интерфейса для пользовательских запросов.
- Пользователь: пользователь, который инициирует запрос, например запрос доступа с помощью Android, IOS, настольных клиентов и т. д.
6.8 Обработка незарегистрированных запросов о состоянии
Запрос статуса выхода из системы на основе файлов cookie:
- Запрос страницы: перенаправление на интерфейс входа в систему SSO Server
- Запрос JSON: возвращает неподписанные данные ответа в формате JSON.
- Формат данных:
- код: 501 код ошибки
- msg: sso не войти.
- Формат данных:
На основе токена, не зарегистрированного в запросе состояния:
- Возвращает неподписанные данные ответа в формате JSON.
- Формат данных:
- код: 501 код ошибки
- msg: sso не войти.
- Формат данных:
6.9 Автоматическое продление статуса входа в систему
Поддерживает настраиваемое окно действия статуса входа в систему, по умолчанию 24 часа, когда срок действия статуса входа превышает половину, он будет автоматически продлен на определенный период.
6.10 Запомнить пароль
Когда пароль не запоминается, состояние входа в систему будет недействительным при закрытии браузера, когда пароль запоминается, состояние входа будет автоматически продлено На основе пользовательского времени продления, в принципе, оно может быть продлено на неопределенный срок. .
6.11 Исключение пути
Пользовательский путь исключает Path, допускает несколько настроек и поддерживает выражения Ant. Используется для исключения путей, которые клиентам SSO не нужно фильтровать.
- 👍🏻: Если у вас есть прибыль, пожалуйста, поставьте лайк и поддержите!
- ❤️: Любимые статьи для удобного просмотра!
- 💬: Обменивайтесь комментариями и развивайтесь друг с другом!