Проект, представленный в этой статье, представляет собой приложение, основанное на протоколе oath2.Реализованная функциональная логика такая же, как иQQ Интернет,Открытая платформа WeiboПохоже, это тот же набор процессов аутентификации и авторизации.
Структура проекта проста и понятна, но не срезает углы.После изучения содержания этой статьи читатели могут напрямую получить код проекта в статье для изучения или скопировать его в производственный проект компании для модификации и использования, поэтому как действительно достичь цели применения того, что они узнали.
Задействованный технологический стек:
- java
- springboot 2.0.1.RELEASE
- spring security 2.0.1.RELEASE
- spring cloud oauth2 2.0.0.M7
- mybatis 2.0.1
Этот проект включает в себя такие функции, как
- новый пользователь
- Регистрация пользователя автоматически назначает права доступа
- Пользователи могут получить доступ только к путям доступа разрешений ролей, которыми они владеют.
- открытая платформа
- Пользователь может подать заявку на получение идентификатора клиента и ключа клиента.
- Пользователь может получить код авторизации по идентификатору клиента
- Пользователь может получить токен доступа и токен referrsh, а также область действия по идентификатору клиента, секретному ключу и коду авторизации.
- API-сервис ресурсов (сервис-заказ/сервис-открытый-апи)
- Настраиваемая конфигурация требует URL авторизации
- Область доступа ограниченного URL-адреса может быть настроена и настроена
- Неавторизованные пользователи или доступ к пользователям, страница запрашивает информацию
- Пользователь обращается к соответствующему URL через токен доступа
Обзор проекта
Сначала взгляните на структурную схему проекта, чтобы понять общую схему проекта.
- .idea: файл, сгенерированный инструментом идеи.
- docker: Храните файлы Dockerfile для создания образов контейнеров.
- config: настройка весенней безопасности и сети в проекте
- контроллер: контроллер запроса
- сущность: пакет класса сущности объекта
- обработчик: пакет класса логической обработки
- mapper: сохранить класс интерфейса mybatis mapper
- сервис: класс обработки бизнес-логики
- util: общий служебный класс
- почтальон: тестовые примеры для инструмента почтальона
- sql: оператор инициализации sql проекта
- шаблоны: файлы шаблонов страниц
Далее я официально представлю детали проекта.Так как сам проект уже имеет много китайских комментариев, конкретная реализация некоторых кодов будет сокращена при объяснении.Если читатели к этому не привыкли, они могут нажать здесь.онлайн сравнение чтенияИли разветвите свой собственный проект, чтобы прочитать ==>код проекта
Как пользователи перехватываются и аутентифицируются
- Пользовательский класс SecurityConfig наследует WebSecurityConfigurerAdapter, указывая, что SecurityConfig будет адаптером конфигурации безопасности Http.
- пройти через
@EnableWebSecurity
Если конфигурация безопасности HttpSecurity включена, этот класс вступит в силу.
- Переопределить метод configure(HttpSecurity http) WebSecurityConfigurerAdapter.
- Укажите, где URL-адрес запроса не нужно перехватывать и выпускать напрямую.
- Укажите, какие запросы необходимо перехватить и проверить
- Переопределить метод configure(AuthenticationManagerBuilder auth) WebSecurityConfigurerAdapter
- Укажите класс службы, который обрабатывает аутентификацию, как MyUserDetailsService.
- Проверить, совпадает ли введенный пароль с паролем пользователя в базе данных
- Пользовательский класс MyUserDetailsService реализует интерфейс UserDetailsService весенней безопасности.
- Перепишите метод loadUserByUsername(String username), где имя пользователя — это атрибут и значение, передаваемое страницей, а атрибут фиксированный.
- Получите сведения о разрешениях, соответствующие таблице разрешений пользователей, и задайте для содержимого свойство UserDetails.Authorities.
- Возвращает подкласс пользователя UserDetails.
Регистрация пользователя автоматически назначает права доступа
Регистрация пользователя вставляет данные в таблицу пользователей и одновременно вставляет часть данных в таблицу ролей пользователей.
Конечно, он может быть более сложным, например, установка различных разрешений в зависимости от источника, времени, белого списка, внутренних рекомендаций и т. д. Читатели могут расширять их самостоятельно.
Пользователи могут получить доступ только к путям доступа разрешений ролей, которыми они владеют.
- Удалить все разрешения текущего пользователя
- Выньте поле идентификатора разрешения разрешения и оберните его в коллекцию списка.
- Сохраните обернутую коллекцию списка разрешений в объекте UserDetails.
- Удалить все содержимое из таблицы разрешений
- http.authorizeRequests() получает текущий объект аутентификации
- Установите все содержимое в таблице разрешений к авторзерусетеру, Antmatches представляет URL-адрес перехвата, HasanyAuthority представляет собой разрешения, которые могут быть доступны
- Поскольку пользователь установил идентификатор разрешения, которым он владеет на приведенном выше рисунке, он может получить доступ к перехваченному URL-адресу.
Пользователь может подать заявку на получение идентификатора клиента и ключа клиента.
Во-первых, давайте взглянем на структуру таблицы, oauth_client_details — это таблица, которая поставляется с Spring Cloud oath2, а user_client_secret — это таблица, созданная нами.
- Сгенерируйте данные OauthClientDetails и сохраните в базе данных
- Получите текущую информацию для входа и привяжите clientId OauthClientDetails к таблице user_client_secret.
Пользователь может получить код авторизации по идентификатору клиента
Конкретная реализация в пакете Spring-Security-OAuth, самореализация в рамках проекта
ID клиента для получения кода авторизации URL запроса:http://localhost:8080/oauth/authorize?response_type=code&client_id=client_92&redirect_uri=http://localhost:8080/code
- Поскольку это необходимо для получения кода авторизации, response_type=code является фиксированным значением.
- ID клиента для клиентского приложения
- web_server_redirect_uri в таблице oauth_client_details
Получить access_token с кодом авторизации
Конкретная реализация находится в пакете spring-security-oauth.org.springframework.security.oauth2.provider.endpoint.TokenEndpoint
Класс, заинтересованные одноклассники могут выполнять отладочную отладку внутри
Получить access_token с кодом авторизации адрес запроса:http://localhost:8080/oauth/token?grant_type=authorization_code&code=8fGtOV&client_id=client_92&client_secret=123456&redirect_uri=http://localhost:8080/code&scope=all
- Код авторизации, полученный из идентификатора клиента
- ID клиента для клиентского приложения
- Секретный ключ клиента совпадает с идентификатором клиента, на который подал заявку клиент.
- web_server_redirect_uri в таблице oauth_client_details
- область в таблице oauth_client_details
# 出现如下类似错误标识code失效,重新在获取授权码操作即可
{
"error": "invalid_grant",
"error_description": "Invalid authorization code: iq30f9"
}
Идентификатор продавца и ключ продавца для получения accessToken и обновления accessToken
- grant_type: тип авторизации, здесь установлен режим пароля
- имя пользователя: имя пользователя
- пароль: пароль пользователя
- client_id: идентификатор клиента, полученный от приложения.
- client_secret: секрет клиента, полученный от приложения.
- scope: идентификатор области, взятый из области в таблице oauth_client_details
обновить токен доступа
Обновите URL-адрес запроса accessToken:http://localhost:8080/oauth/token?grant_type=refresh_token&refresh_token=4741d043-e202-4de0-ae21-4f5c7ec5626e&client_id=client_1&client_secret=123456
Убедитесь, что accessToken действителен
Проверьте URL-адрес запроса accessToken:http://localhost:8080/oauth/check_token?token=1131809b-ee12-4aea-9823-ea4454b96f2d
API-сервис ресурсов
Вот, давайте рассмотрим еще один проект order-service, на самом деле правильнее назвать его order-api-resource, но мне лень его менять. Структура и код этого проекта относительно скудны, поэтому его легче изучить.
Как настроить конфигурацию URL-адреса, который необходимо перехватить и авторизовать
пройти черезantMatchers()
иauthenticated()
способ настройки и просмотреть содержимое в красном поле на рисунке. Это URL-адреса пути запроса, которые необходимо перехватить и проверить. Помимо перехвата запросов, вы также можете указать метод запроса перехвата, например доступ/api/trade/, перехватывается только POST-доступ, а GET-запрос освобождается.
Как настроить и настроить область доступа ограниченных URL-адресов
пройти черезaccess()
Метод указывает область, требуемую URL-адресом, к которому осуществляется доступ, и значением является значение области в таблице oauth_client_details. Если значение области не соответствует значению, определенному в коде, произойдет следующая ошибка:
Неавторизованные пользователи или пользователи с недостаточными правами доступа, на странице запрашивается соответствующая информация
Как пользователь получает доступ к соответствующему URL-адресу через токен доступа
- Настройте адрес службы, чтобы проверить, действителен ли accessToken, который на самом деле является службой, выдающей указанный выше accessToken.
- Вам необходимо настроить идентификатор продавца и ключ продавца, чтобы получить accessToken, который используется для прохождения проверки платформы разработки. Некоторые друзья могут быть странными.В статье также рассказывается, действителен ли проверочный accessToken, но нет необходимости подтверждать логин.Зачем он вам здесь? Давайте посмотрим на исходный код:
RemoteTokenServices.java в spring-security-oauth2-2.2.1.RELEASE-sources.jar используется для удаленного вызова службы токенов (платформа разработки) для работы
- Поскольку атрибут Authorization установлен для заголовка http, чтобы указать, что требуется проверка подлинности, берутся clientId и clientSecret в приведенной выше конфигурации, иначе запрос не будет проверен открытой платформой.
- postForMap() оборачивает параметры и выполняет отправку запроса