задний план
В последнее время я работаю над безопасностью и аутентификацией API-интерфейсов платформы. Безопасность интерфейса и аутентификация очень важны в производственной деятельности. В настоящее время наиболее популярным методом аутентификации является Oauth2. Далее давайте воспользуемся зависимостями безопасности SpringBoot, чтобы просто попрактиковаться и понять процесс Oauth2.
Простое понимание Oauth2
что это?
Это механизм авторизации, используемый для авторизации сторонних приложений для получения пользовательских данных.
Четыре способа авторизации
-
Режим кода авторизации (код авторизации)
Этот метод является наиболее безопасным, код авторизации передается через интерфейс, а токен хранится на сервере. В основном подходит для веб-приложений с бэкендами.
-
неявный (неявный)
Этот метод не имеет промежуточных шагов кода авторизации и очень небезопасен. В основном подходит для чистых интерфейсных приложений.
-
пароль
Этот метод требует, чтобы пользователи очень доверяли сторонним приложениям, что относительно рискованно.
-
учетные данные клиента
Этот метод подходит для приложений между серверами и серверами и касается аутентификации безопасности интерфейса.
учетные данные клиента
Этот подход представляет собой подход к аутентификации, который мы в основном практикуем сегодня. Если есть учащиеся, которые часто подключаются к внешним третьим лицам во время обычного открытия, они должны быть хорошо знакомы с этим методом аутентификации. Самое обычное для нас — получить токен доступа с официального сервера официального аккаунта WeChat в разработке WeChat, после чего мы запрашиваем соответствующий интерфейс WeChat, и нам нужно принести этот токен доступа, чтобы иметь разрешение на доступ.
SpringBoot Oatuh2 Простая практика
После того, как у нас есть краткое представление об Oauth2, давайте быстро его реализуем.
Шаги грубого обдумывания:
- Введение связанных зависимостей
- настроить
- Информация об услуге аутентификации
- Информация о службе ресурсов
- проверять
- Получить токен доступа для аутентификации
- доступ к ресурсам
Pom
Чтобы включить аутентификацию Oauth2, мы должны ввести зависимости безопасности SpringBoot и зависимости Spring Oauth2.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
</dependency>
После введения зависимостей аутентификации безопасности SpringBoot по умолчанию будет защищать все ресурсы на сервере ресурсов.
Authorization Service Config — конфигурация службы аутентификации
Конфигурация службы аутентификации в основном включает следующие три аспекта:
-
Определите ограничения безопасности для конечной точки маркера
Основная конфигурация: разрешать ли клиенту входить в систему в виде формы, определять метод шифрования пароля и т. д.
-
Определить детали клиента
Информация о клиенте включает в себя: метод хранения информации о клиенте (память или база данных) и информацию, необходимую для аутентификации клиента, включая client_id, client_secret, grant_type, scope
-
Определите конечные точки авторизации и токенов, а также службы токенов.
Вы можете настроить авторизованную конечную точку, способ хранения токена и т. д.
Конфигурация службы аутентификации выглядит следующим образом: (Эта практика соответствует принципу сохранения того, что можно сохранить)
@Configuration
@EnableAuthorizationServer
public class MyAuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter {
/**
* 配置安全约束相关配置
* @param security 定义令牌终结点上的安全约束
* @throws Exception
*/
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
// 支持client_id、client_secret以form表单的形式登录,参考可见:微信获取access token
security.allowFormAuthenticationForClients();
}
/**
* 配置客户端详细信息
* @param clients 定义客户端详细信息服务的配置程序。可以初始化客户端详细信息,也可以只引用现有存储。
* @throws Exception
*/
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
// client_id
.withClient("gold")
// 授权方式
.authorizedGrantTypes("client_credentials")
// 授权范围
.scopes("write")
// client_secret
.secret("{noop}123456");
}
/**
*
* @param endpoints 定义授权和令牌端点以及令牌服务。
* @throws Exception
*/
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
super.configure(endpoints);
}
}
Обратите внимание на конфигурацию пароля, и вам необходимо настроить метод шифрования.Эта практика не использует какой-либо метод шифрования.
Дополнительные сведения см. в разделе ДелегированиеPasswordEncoder или PasswordEncoderFactories.
Конфигурация службы ресурсов — конфигурация службы ресурсов
Конфигурация сервисов ресурсов в основном включает следующие два аспекта:
-
Конфигурация безопасности служб ресурсов
Настраиваемый идентификатор ресурса, без сохранения состояния — разрешает ли ресурс только аутентификацию на основе токенов, как хранится токен и т. д.
-
Настройка безопасности HTTP
Наш защищенный API настроен здесь
Конфигурация, связанная с ресурсами:
API:
@RestController
@AllArgsConstructor
public class ResController {
@GetMapping("/res/{id}")
public String testOauth(@PathVariable String id) {
return "Get the resource " + id;
}
}
Конфигурация службы ресурсов:
@Configuration
@EnableResourceServer
public class MyResourceServerConfigurer extends ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
super.configure(resources);
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/res/**").authenticated();
}
}
Полная сводка конфигурации
Мы завершили самую базовую настройку SpringBoot Oauth2.
Информация о клиенте:
- client_id : gold
- client_secret : 123456
- scopes : write
- grant_type : client_credentials
Далее, давайте проверим, что наша конфигурация вступила в силу.
Следующий запрос делается в postman. base_url — это установленная глобальная переменная, которая на самом делеhttp://127.0.0.1:8080
прямой запрос
Когда мы запрашиваем его напрямую, приложение возвращает Unauthorized и не может получить доступ:
получить токен доступа
Конечная точка Springboot oauth для получения токена по умолчанию: /oauth/token
Как видно из результата запроса, мы получили access_token, а время обновления составляет 43199 секунд или 12 часов.
запросить защищенный ресурс
В результате мы успешно использовали токен доступа для доступа к защищенному ресурсу.
резюме
В этой статье кратко рассказывается, что такое Oauth2 и как его авторизовать.Студенты, которые хотят узнать больше об Oauth2, могут перейти наБлог учителя Жуань ИфэнИди и учись. После этого метод аутентификации учетных данных на стороне клиента просто реализуется с помощью SpringBoot.Основной ключевой момент его настройки — понятьКонфигурация сервера ресурсов (ResourceServerConfigurer)а такжеКонфигурация сервера аутентификации (AuthorizationServerConfigurer). Студенты, двигайтесь и действуйте!
Персональный уровень ограничен, приглашаем всех исправлять и общаться вместе~~~
демо:GitHub.com/золотая тыква…
Reference: