1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/frank_liu_1-jpassport

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

jpassport

  1. Обзор jpassport — это модуль проверки авторизации на основе токена. Он прошёл проверку в производственной среде крупной социальной сети и способен справляться с высокими нагрузками, может быть развёрнут кластеризованно.

GitHub: https://github.com/liushaoming/jpassport

Рекомендуется посетить GitHub для получения доступа к другим распределённым проектам автора: https://github.com/liushaoming?tab=repositories

Как появился jseckill? Автор liushaoming ранее работал над крупным проектом бэкенда для корпоративного приложения социальной сети. В этом проекте он разработал модуль входа в систему. Первоначально проект был реализован с использованием Spring MVC, но впоследствии был переписан на более новую версию Spring Boot 2.X.

Проект успешно прошёл испытание высокой нагрузкой в условиях крупной социальной сети, что подтверждает его способность поддерживать масштабные интернет-проекты.

  1. Выбор технологий
  • Spring + Spring Boot 2.X + MyBatis. Подходит для проектов SpringMVC или SpringBoot.
  • Maven 3.0.
  • Jdk 1.8+.
  • MySQL или другая база данных.
  • Redis.
  1. Использование модуля jpassport-lib Для использования библиотеки jpassport-lib рекомендуется обратиться к проекту jpassport-web.

Шаги по использованию:

  • Шаг 1: клонируйте репозиторий jpassport с помощью команды git clone.
  • Шаг 2: установите jpassport-lib.jar в локальный репозиторий Maven. Перейдите в каталог jpassport-lib и выполните команду mvn install.
  • Шаг 3: добавьте зависимость от jpassport-lib в свой проект SpringMVC или SpringBoot в файле pom.xml.
  • Шаг 4: создайте таблицы fly_token и fly_user в базе данных, следуя SQL-сценариям в doc/db/xxx.sql. Настройте параметры базы данных и Redis в файлах flylib-site/resources/property/jdbc.properties и redis.properties соответственно.
  • Шаг 5: запустите проект jpassport-web (или ваш собственный проект). В среде разработки, такой как IDEA или Eclipse, найдите файл App.java в jpassport-web и запустите его в режиме отладки.
  1. Тестирование Приведены некоторые тестовые URL:

После успешного входа сервер возвращает токен клиенту. Все HTTP-запросы, требующие аутентификации, должны включать параметры userId и token в заголовках запроса. Пример запроса:

URL: http://localhost:20100/account/getInfo Тип: POST Заголовки: userId=5 token=069473bedcc609b0d25d6746c11760e5

Можно использовать Postman для тестирования.

  1. Анализ исходного кода Основная концепция: Используется Spring Web Interceptor для перехвата параметров userId и token из заголовков HTTP-запросов. Сервер выполняет аутентификацию, сравнивая токен с данными, хранящимися в Redis, которые были сохранены в MySQL. Токен генерируется при регистрации и обновляется после изменения пароля, обеспечивая надёжную аутентификацию в распределённой среде. Код:

false; } Passport passport = loginIntercepterService.getPassport(Long.valueOf(userIdStr)); String storedToken = passport.getToken(); if (StringUtils.isEmpty(storedToken)) { flushError(response, AuthResponseCode.TOKEN_EXPIRED, AuthResponseCode.TOKEN_EXPIRED_DESC); return false; } else if (!storedToken.equals(token)) { flushError(response, AuthResponseCode.TOKEN_INVALID, AuthResponseCode.TOKEN_INVALID_DESC); return false; }

else { flushError(response, AuthResponseCode.USER_ID_IS_NULL, AuthResponseCode.USER_ID_IS_NULL_DESC); return false; } // 被@AuthController注解的 结束

}

boolean flag = isPermission(request, response); logger.info("isPermission:" + flag); return flag; } Текст:

Будет проверяться, был ли текущий контроллер, к которому обращается клиент, помечен аннотацией @AuthController. Если он был помечен, то будет выполнена логика авторизации. Логика авторизации извлечёт значения userId и token из заголовков HTTP. Серверная часть будет искать правильный токен в Redis на основе userId (если его нет, он будет искать в базе данных, Redis ускоряет доступ к данным). Если сохранённый токен совпадает с токеном в заголовке, LoginInterceptor разрешит продолжить, и бизнес-логика MVC будет продолжена. В противном случае доступ будет отклонён, и код ошибки и описание кода будут возвращены клиенту в виде строки JSON.

6. Вопросы и ответы

6.1 Почему userId и token помещаются в заголовок?

Изначально их можно было поместить в тело HTTP-запроса (HTTP body). Однако, поскольку в теле запроса может быть много параметров, принадлежащих пользователю, их совместное размещение может привести к путанице. Более стандартным подходом является размещение этих разрешений в заголовках запросов.

6.2 Где хранятся userId и token на клиенте?

На стороне HTTP-клиента они должны храниться в cookie, которые необходимо считывать при каждом запросе. На Android-клиенте их можно хранить в SharedPreferences.

6.3 Почему используется Spring Boot 2.X?

Spring Boot подходит для быстрой сборки приложений на Spring. Кроме того, здесь своевременно обновляется до Spring Boot 2.X, что позволяет избежать необходимости обновления кода разработчиками. Это готовое решение «из коробки».

Связаться с автором

Способ связи
Лидер liushaoming
email liushaomingdev@163.com
QQ 944147540

Предложения по улучшению кода следует направлять через Issues. Присоединяйтесь к группе для обсуждения.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Токен, модуль входа, SpringBoot2. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/frank_liu_1-jpassport.git
git@api.gitlife.ru:oschina-mirror/frank_liu_1-jpassport.git
oschina-mirror
frank_liu_1-jpassport
frank_liu_1-jpassport
master