[Продвинутое развитие основных принципов Spring] [SpringCloud интегрирует Spring Security OAuth2] Углубленное понимание Spring Security OAuth2: базовый анализ + использование + практический бой
[Продвинутое развитие основных принципов Spring] [SpringCloud интегрирует Spring Security OAuth2] Углубленное понимание Spring Security OAuth2: базовый анализ + использование + практический бой

Я начал писать эту статью неделю назад. Она объединяет исходный код, принципы реализации и использования, а также практические примеры для объяснения.

Я надеюсь, что это поможет всем. Если у вас есть цель обучения и обмена, вы можете оставить сообщение и сообщить мне, что я выпущу ресурсы в будущем. Система управления логистикой, совместимая со сторонней сертификацией, интегрированная с использованием микросервисной архитектуры.

Если есть ошибки, поправьте меня в сообщениях! ! ! благодарный! ! !

1 Введение

1.1 Что такое протокол OAuth2?

OAuth2 (открытая авторизация 2.0) — это открытый стандартный протокол авторизации для доступа к ресурсам пользователя, хранящимся у поставщика услуг, через сторонние приложения без раскрытия учетных данных пользователя (например, имени пользователя и пароля). Это позволяет пользователям разрешать сторонним приложениям доступ к защищенным ресурсам, гарантируя при этом, что учетные данные пользователей не будут напрямую доступны сторонним приложениям.

Целью разработки протокола OAuth2 является упрощение процесса авторизации и повышение безопасности за счет делегирования авторизации и использования токенов для обеспечения безопасной связи между пользователями и сторонними приложениями. Он стал распространенным стандартом авторизации, используемым многими поставщиками интернет-услуг и разработчиками при создании приложений.

1.2 Роль и важность OAuth2

Роль OAuth2 заключается в реализации стандартизированного процесса авторизации пользователей и доступа к ресурсам, а также в обеспечении безопасного и масштабируемого способа управления разрешениями сторонних приложений на доступ к пользовательским ресурсам. Вот некоторые важные роли OAuth2:

  • Авторизация пользователя: OAuth2 позволяет пользователям разрешать сторонним приложениям доступ к определенным ресурсам, тем самым защищая конфиденциальность пользователей и безопасность данных.
  • Нет необходимости передавать учетные данные: OAuth2 реализует авторизацию с помощью токенов, поэтому учетную информацию пользователя (например, имя пользователя и пароль) не нужно передавать сторонним приложениям, что повышает безопасность.
  • Безопасная связь: OAuth2 использует токены для представления личности и разрешений пользователя, гарантируя, что связь между пользователями и сторонними приложениями является безопасной и надежной.
  • Управление разрешениями: OAuth2 обеспечивает детальный контроль над разрешениями доступа пользователей к ресурсам, позволяя пользователям выборочно разрешать различные разрешения для разных приложений.

1.3 Введение в Spring Security OAuth2

Spring Security OAuth2 — это модуль расширения платформы Spring Security, используемый для реализации функций аутентификации и авторизации на основе протокола OAuth2. Он предоставляет набор простых в использовании и интегрированных API, которые помогают разработчикам реализовывать различные режимы авторизации и процессы OAuth2 в приложениях Spring.

Spring Security OAuth2 расширяет функции Spring Security и предоставляет такие функции, как настройка и управление клиентами OAuth2, серверами авторизации, хранилищем токенов и управлением разрешениями. Это позволяет разработчикам легко создавать безопасные службы OAuth2 и клиентские приложения.

Теперь давайте более подробно рассмотрим работу протокола OAuth2 и различные режимы авторизации.

2.Процесс протокола OAuth2.

2.1 Настройка сервера регистрации и авторизации клиентов

В OAuth2 сначала нужно зарегистрировать клиент и настроить сервер авторизации. Клиент — это приложение, которому необходим доступ к защищенным ресурсам, а сервер авторизации отвечает за аутентификацию пользователя и выдачу токенов доступа.

Ниже приведен пример фрагмента кода, демонстрирующий, как настроить серверы регистрации и авторизации клиентов в Spring Security:

Язык кода:javascript
копировать
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
            .withClient("client1")
            .secret(passwordEncoder().encode("client1secret"))
            .authorizedGrantTypes("authorization_code", "refresh_token")
            .scopes("read", "write")
            .redirectUris("http://localhost:8080/callback");
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

В приведенном выше коде,мы использовали@EnableAuthorizationServerаннотация для включения авторизациисервер,и пройтиconfigure(ClientDetailsServiceConfigurer clients)метод настраивает хранящийся в памятиклиент。клиентIDдля"client1",Пароль: «client1secret».,Режимы авторизации: «authorization_code» и «refresh_token».,Область авторизации — «чтение» и «запись».,перезвонитьURLдля"http://localhost:8080/callback"。

2.2 Предоставление кода авторизации

Режим кода авторизации — наиболее часто используемый режим авторизации в OAuth2. В этом режиме клиент перенаправляет пользователя на страницу входа на сервер авторизации. После того, как пользователь авторизуется и соглашается на авторизацию, сервер авторизации возвращает код авторизации клиенту. Затем клиент использует код авторизации для запроса токена доступа с сервера авторизации.

Ниже приведен пример кода для процесса режима кода авторизации:

Язык кода:javascript
копировать
@Controller
public class AuthorizationCodeController {

    @GetMapping("/authorize")
    public String authorize(@RequestParam("response_type") String responseType,
                            @RequestParam("client_id") String clientId,
                            @RequestParam("redirect_uri") String redirectUri,
                            @RequestParam("scope") String scope,
                            @RequestParam("state") String state) {
        // Обработайте запрос авторизации и вернитесь на страницу авторизации.
    }

    @GetMapping("/callback")
    public String callback(@RequestParam("code") String code,
                           @RequestParam("state") String state) {
        // Обработать обратный вызов кода авторизации и запросить токен доступа с сервера авторизации.
    }
}

В приведенном выше коде,/authorizeКонечная точка, используемая для обработки запросов авторизации,Путем перенаправления пользователя на авторизованную страницу входа.,После того как пользователь авторизуется и согласится на авторизацию,Сервер авторизации возвращает код авторизации клиенту. Затем,клиентперенаправит пользователей наredirect_uriназначенныйперезвонитьURL,И вперезвонитьURLПолучить код авторизации。 /callbackКонечная точка для обработки кодов авторизацииперезвонить,клиент После получения кода авторизации через URL обратного вызова,Запросы могут быть отправлены на авторизованный сервер.,Получите токен доступа, используя код авторизации。 Аналогичным образом существуют режимы авторизации, такие как упрощенный режим, режим пароля, режим учетных данных клиента и токен обновления. Каждая модель авторизации имеет разные процессы и реализации кода.

Ниже приведен пример кода процесса OAuth2:

Язык кода:javascript
копировать
@Controller
public class OAuth2Controller {

    @Autowired
    private OAuth2RestTemplate restTemplate;

    @GetMapping("/authorize")
    public String authorize() {
        // Перенаправить пользователя на авторизованную страницу входа
    }

    @GetMapping("/callback")
    public String callback(@RequestParam("code") String code) {
        // Запросите токен доступа у сервера авторизации, используя код авторизации.
    }

    @GetMapping("/protected-resource")
    public String protectedResource() {
        // Доступ к защищенным ресурсам с помощью токенов доступа
    }
}

В приведенном выше коде,/authorizeКонечная точка, используемая для перенаправления пользователей на авторизациюсерверстраница входа。После того как пользователь авторизуется и согласится на авторизацию,URL-адрес обратного вызова, который разрешает серверу перенаправлять пользователя обратно к клиенту.,И включите код авторизации в URL. /callbackКонечная точка для обработки кодов авторизацииперезвонить,клиент После получения кода авторизации через URL обратного вызова,Может Запросите токен доступа у сервера авторизации, используя код авторизации.。 /protected-resourceКонечная точка используется для демонстрации того, как Доступ к защищенным ресурсам с помощью токенов доступ. в практическом применении,Вы можете использовать токены доступа для доступа к API или ресурсам, требующим авторизации.

3. Принцип протокола OAuth2

3.1 Роли и концепции в OAuth2:

В протоколе OAuth2 существуют следующие основные роли и концепции:

  • Владелец ресурса: пользователь или представитель системы, владеющий защищенными ресурсами.
  • клиент (Клиент): приложение, которое взаимодействует с авторизованным сервером от имени владельца ресурса. Это может быть веб-приложение, мобильное приложение или сторонний сервис.
  • Авторизация: Авторизация: Авторизация: Доступ Токен) клиенту. Обычно это независимый сервер, который можно отделить или объединить с сервером ресурсов.
  • Ресурсный сервер (Ресурс Сервер): хранит защищенные ресурсы.,И выполнять контроль доступа на основе действительности токена. Ресурс может представлять собой одну или несколько услуг.,Может быть отделен или объединен с сервером авторизации.
  • Грант на авторизацию: учетные данные, предоставляемые владельцем ресурса клиенту для доступа к защищенному ресурсу.,Например, код авторизации, Неявная авторизация、Авторизация по паролю、клиентский ваучер и т. д.
  • Токен: учетные данные, используемые для представления разрешений на авторизацию, включая токены доступа, токены обновления, токены идентификации и т. д.
  • Конечная точка токена (Token Конечная точка): конечная точка API, где клиент взаимодействует с сервером авторизации для получения или обновления токена.

3.2 Генерация и проверка токенов:

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

Процесс генерации и проверки токена можно проиллюстрировать следующим примером кода:

Язык кода:javascript
копировать
// Пример кода для создания токена доступа
String generateAccessToken() {
    // Создать строку токена произвольного доступа
    String accessToken = generateRandomToken();
    
    // Установить срок действия токена доступа
    Date expiration = calculateExpirationDate();
    
    // Сохраните токен доступа в базу данных или кеш
    saveAccessToken(accessToken, expiration);
    
    return accessToken;
}

// Пример кода для проверки токена доступа
boolean validateAccessToken(String accessToken) {
    // Получите токен доступа и срок действия из базы данных или кеша.
    AccessToken storedToken = getAccessTokenFromDatabase(accessToken);
    
    // Убедитесь, что токен доступа существует и срок его действия не истек.
    if (storedToken != null && storedToken.isExpired()) {
        return false;
    }
    
    return true;
}

В приведенном выше примере,generateAccessTokenМетод, используемый для генерации токена произвольного доступа,и установите срок его действия,Затем Сохраните токен доступа в базу данных или кеш。validateAccessTokenМетод, используемый для проверки правильности переданного токена доступа.,Проверка осуществляется путем получения токена из базы данных или кэша и проверки его существования и срока действия.

3.3 Взаимодействие сервера авторизации и сервера ресурсов:

В протоколе OAuth2 сервер авторизации и сервер ресурсов взаимодействуют для проверки действительности токена и разрешения на авторизацию.

Ниже приведен пример кода для взаимодействия сервера авторизации и сервера ресурсов:

Язык кода:javascript
копировать
// Авторизоватьсервер Пример кода для проверки токена доступа
boolean validateAccessToken(String accessToken) {
    // Отправьте запрос на проверку на сервер ресурсов
    boolean isValid = resourceServer.validateToken(accessToken);
    
    return isValid;
}

// ресурссервер Пример кода для проверки токена доступа
boolean validateToken(String accessToken) {
    // Получите токен доступа и срок действия из базы данных или кеша.
    AccessToken storedToken = getAccessTokenFromDatabase(accessToken);
    
    // Убедитесь, что токен доступа существует и срок его действия не истек.
    if (storedToken != null && storedToken.isExpired()) {
        return false;
    }
    
    return true;
}

3.4 Соображения безопасности и меры защиты: (Интеграция Spring Cloud)

При внедрении протокола OAuth2 необходимо учитывать следующие вопросы безопасности и принимать соответствующие меры защиты:

Безопасная передача токенов. Токены должны быть надежно зашифрованы при передаче между клиентом и сервером, чтобы предотвратить перехват и подделку токена. Передачу токенов можно защитить с помощью протокола HTTPS. Когда клиент устанавливает соединение с сервером, клиент отправляет HTTPS-запрос. Сервер возвращает сертификат, содержащий открытый ключ, который клиент использует для шифрования симметричного ключа, и отправляет зашифрованный ключ на сервер. Сервер использует закрытый ключ для расшифровки симметричного ключа и установления безопасного соединения с клиентом. В Spring Cloud HTTPS можно включить, настроив Spring Security. Сначала необходимо создать сертификат SSL и настроить его в приложении. Затем добавьте следующий код в класс конфигурации Spring Security:
Язык кода:javascript
копировать
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.requiresChannel()
                .anyRequest().requiresSecure();
    }
}
Конфиденциальность токенов. Токены должны храниться только на серверах авторизации и серверах ресурсов и не должны распространяться через клиентов или другие ненадежные каналы. Клиенты должны принять соответствующие меры безопасности, такие как шифрование при хранении токенов. В Spring Cloud конфиденциальность токена может быть достигнута с помощью Spring Security OAuth2. На сервере авторизации и сервере ресурсов вы можете настроить алгоритм шифрования и ключ для шифрования токена. Конфигурация сервера авторизации:
Язык кода:javascript
копировать
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    // Ключи хранятся в базе данных или файле конфигурации.
    private static final String SECRET_KEY = "your-secret-key";

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("your-client-id")
                .secret(SECRET_KEY)
                .authorizedGrantTypes("password", "refresh_token")
                .scopes("read", "write")
                .accessTokenValiditySeconds(3600)
                .refreshTokenValiditySeconds(86400);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore());
    }

    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }

    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey(SECRET_KEY);
        return converter;
    }
}

Конфигурация сервера ресурсов:

Язык кода:javascript
копировать
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/api/**").authenticated();
    }
}
Управление сроком действия токенов. Токены должны иметь соответствующий срок действия, чтобы ограничить продолжительность их использования. Сервер авторизации должен регулярно проверять и очищать токены с истекшим сроком действия, а также обеспечивать механизм обновления токенов, чтобы клиенты могли получать новые токены. В Spring Cloud вы можете использовать функционал Spring Security OAuth2 для управления сроком действия токенов:
Язык кода:javascript
копировать
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    // ...

    @Autowired
    private TokenStore tokenStore;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore)
                .tokenEnhancer(tokenEnhancerChain());
    }

    @Bean
    public TokenEnhancerChain tokenEnhancerChain() {
        TokenEnhancerChain chain = new TokenEnhancerChain();
        chain.setTokenEnhancers(Arrays.asList(accessTokenConverter()));
        return chain;
    }
}
Атаки с подделкой межсайтовых запросов (CSRF). Клиенты должны принимать соответствующие меры защиты CSRF, такие как использование случайно сгенерированных токенов для проверки запросов, чтобы предотвратить использование вредоносными сайтами учетных данных доверенных пользователей. В Spring Cloud вы можете использовать функцию защиты CSRF Spring Security для предотвращения атак CSRF:
Язык кода:javascript
копировать
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }
}
Ограничение частоты и контроль доступа. Серверы авторизации и серверы ресурсов должны реализовывать соответствующие политики ограничения частоты и контроля доступа, чтобы предотвратить злоупотребление злонамеренными пользователями или злонамеренными клиентами и атаку на систему. Ограничение частоты и контроль доступа можно реализовать с помощью функций Spring Security:
Язык кода:javascript
копировать
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/api/**").hasAnyRole("USER", "ADMIN")
                .and()
                .addFilterBefore(rateLimitFilter(), UsernamePasswordAuthenticationFilter.class);
    }

    @Bean
    public RateLimitFilter rateLimitFilter() {
        return new RateLimitFilter();
    }
}

Затем создайте фильтр для управления. Здесь используется OncePerRequestFilter:

Язык кода:javascript
копировать
public class RateLimitFilter extends OncePerRequestFilter {

    private static final int MAX_REQUESTS_PER_SECOND = 10;

    private final Map<String, Long> requestCounts = new ConcurrentHashMap<>();

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String clientId = getClientId(request);
        if (clientId != null) {
            if (exceedsRateLimit(clientId)) {
                response.sendError(HttpStatus.TOO_MANY_REQUESTS.value(), "Rate limit exceeded");
                return;
            } else {
                incrementRequestCount(clientId);
            }
        }

        filterChain.doFilter(request, response);
    }

    private String getClientId(HttpServletRequest request) {
        // Получить clientID по запросу
        // Например, получить его из заголовка запроса или получить из параметра запроса.
        return request.getHeader("Client-Id");
    }

    private boolean exceedsRateLimit(String clientId) {
        long currentTimestamp = System.currentTimeMillis();
        requestCounts.entrySet().removeIf(entry -> entry.getValue() < currentTimestamp - 1000);
        return requestCounts.compute(clientId, (k, v) -> v == null ? 1 : v + 1) > MAX_REQUESTS_PER_SECOND;
    }

    private void incrementRequestCount(String clientId) {
        requestCounts.compute(clientId, (k, v) -> v == null ? 1 : v + 1);
    }
}
Аудит и мониторинг безопасности. Система должна иметь механизмы аудита и мониторинга безопасности для записи и мониторинга действий, связанных с токенами, а также для обнаружения и реагирования на потенциальные инциденты безопасности. Здесь вы можете использовать Spring Boot Actuator и другие инструменты аудита безопасности для реализации аудита и мониторинга безопасности.

первый,Добавьте необходимые зависимости в проектpom.xmlв файле:

Язык кода:javascript
копировать
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Затем,существоватьapplication.propertiesилиapplication.ymlв файле Настройка аудита безопасностиимонитор:

Язык кода:javascript
копировать
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
management.endpoint.auditevents.enabled=true
Язык кода:javascript
копировать
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always
    auditevents:
      enabled: true

После настройки этого,Можетпутем доступа/actuator/auditeventsКонечная точка для получения информации о событиях аудита, связанной с токеном.。

3.5 Расширения и варианты протокола OAuth2:

Протокол OAuth2 — это гибкий протокол, который можно расширять и изменять по мере необходимости. Вот некоторые распространенные расширения и варианты протокола OAuth2:
  1. OpenID Connect: OpenID Connect — это протокол аутентификации, основанный на протоколе OAuth2. Он используется для реализации функции поставщика удостоверений на основе OAuth2 и обеспечивает возможность аутентификации пользователей и получения информации о пользователях.
  2. JWT (веб-токены JSON): JWT — это формат токенов на основе JSON, используемый для представления токенов в протоколе OAuth2. JWT можно использовать для включения в токен дополнительной информации об утверждении, чтобы облегчить проверку и передачу идентификационной информации пользователя.
  3. PKCE (ключ подтверждения для обмена кодами): PKCE — это расширение, используемое для повышения безопасности режима кода авторизации. Оно использует случайно сгенерированный ключ для связывания использования кода авторизации во избежание перехвата и повторного воспроизведения кода авторизации.
  4. Поток устройств. Поток устройств — это процесс авторизации, подходящий для устройств, у которых нет браузеров и клавиатур, таких как смарт-телевизоры, устройства IoT и т. д. Он взаимодействует с авторизацией, используя ограниченный пользовательский интерфейс и пользовательский агент на устройстве.
  5. Пользовательский тип авторизации. В зависимости от конкретных потребностей протокол OAuth2 можно расширить для реализации пользовательских типов авторизации. Эти пользовательские типы авторизации могут определять новые процессы авторизации и методы лицензирования в зависимости от требований приложения.
Я не буду здесь вдаваться в подробности. Конкретный выбор делается на основе реального бизнеса.

4. Механизм реализации Spring Security OAuth2.

4.1 Основные компоненты Spring Security OAuth2: Spring Security OAuth2 предоставляет некоторые основные компоненты для реализации механизма аутентификации и авторизации OAuth2. К ним относятся:

  • Authorization Сервер (сервер авторизации): отвечает за выдачу токенов доступа (доступ токен) и токен обновления (Обновить Токен), используемый для аутентификации и авторизации.
  • Сервер ресурсов (сервер ресурсов): защищает ресурсы с ограниченным доступом, для доступа к которым требуется токен доступа.
  • Клиент (клиент): представляет пользователя или приложение.,Запросить токен доступа с сервера авторизации,и используйте токен для доступа к ограниченным ресурсам.
  • Пользователь: конечный владелец ресурса.,Аутентификация и авторизация через клиента.

Эти компоненты работают вместе для реализации механизма аутентификации и авторизации OAuth2. Ниже мы подробно объясним, как настроить и использовать эти компоненты.

4.2 Настройка Spring Security OAuth2: Сначала нам нужно настроить Spring Security OAuth2 в проекте Spring Boot. Вот простой пример конфигурации:

Язык кода:javascript
копировать
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    
    @Autowired
    private AuthenticationManager authenticationManager;
    
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
            .withClient("client_id")
            .secret("client_secret")
            .authorizedGrantTypes("authorization_code", "refresh_token")
            .scopes("read", "write")
            .accessTokenValiditySeconds(3600)
            .refreshTokenValiditySeconds(86400);
    }
    
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }
}

В приведенном выше коде,мы проходим@EnableAuthorizationServerАвторизация аннотаций включенасервер,и унаследовалAuthorizationServerConfigurerAdapterКласс для настройки авторизациисервер。существоватьconfigureв методе,Мы настроили простой клиент,включатьклиентID、ключ、Тип авторизации、Область действия и срок действия токенов доступа и обновления.。существоватьconfigureв методе,Мы также будемauthenticationManagerВвести вAuthorizationServerEndpointsConfigurerсередина,для аутентификации пользователя.

4.3 Настройте сервер авторизации и сервер ресурсов:

Spring Security OAuth2Разрешите нам настроить авторизациюсервериресурссервер。нас Можетв расширенииAuthorizationServerConfigurerAdapterиResourceServerConfigurerAdapterКласс для реализации пользовательской конфигурации。
Вот простой пример:
Язык кода:javascript
копировать
@Configuration
@EnableAuthorizationServer
public class CustomAuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    // Настройка пользовательского сервера авторизации
}

@Configuration
@EnableResourceServer
public class CustomResourceServerConfig extends ResourceServerConfigurerAdapter {
    // Настройка сервера пользовательских ресурсов
}

В приведенном выше коде,Мы отдельно продлилиAuthorizationServerConfigurerAdapterиResourceServerConfigurerAdapterдобрый,и использовать@EnableAuthorizationServerи@EnableResourceServerАннотация включает пользовательскую авторизациюсервериресурссервер。нас Можетсуществовать Соответствующая конфигурациядобрыйсередина Добавить пользовательскую конфигурацию,Например, определить правила доступа, менеджеры аутентификации и т. д.

4.4 Процесс аутентификации и авторизации пользователя:

Процесс Spring Security OAuth2, обрабатывающий аутентификацию и авторизацию пользователя, выглядит следующим образом:

Клиент инициирует запрос аутентификации на сервер авторизации, предоставляя идентификатор клиента, ключ, тип авторизации и другую информацию.

Язык кода:javascript
копировать
// Пример кода клиента для инициирования запроса аутентификации
RestTemplate restTemplate = new RestTemplate();

// Создание параметров запроса аутентификации
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("grant_type", "password");
params.add("username", "user");
params.add("password", "password");
params.add("client_id", "client_id");
params.add("client_secret", "client_secret");

// Инициировать запрос аутентификации
ResponseEntity<TokenResponse> response = restTemplate.postForEntity("http://localhost:8080/oauth/token", params, TokenResponse.class);
TokenResponse tokenResponse = response.getBody();

Сервер авторизации проверяет личность и разрешения клиента, а также выдает токены доступа и токены обновления.

Язык кода:javascript
копировать
// Пример кода для настройки сервера авторизации
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
            .withClient("client_id")
            .secret("client_secret")
            .authorizedGrantTypes("password", "refresh_token")
            .scopes("read", "write")
            .accessTokenValiditySeconds(3600)
            .refreshTokenValiditySeconds(86400);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }
}

Клиент использует токен доступа, чтобы запросить сервер ресурсов для получения ограниченных ресурсов.

Язык кода:javascript
копировать
// пример клиентского кода для запроса сервера ресурсов
RestTemplate restTemplate = new RestTemplate();

// Установить токен доступа
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + tokenResponse.getAccess_token());
HttpEntity<String> entity = new HttpEntity<>(headers);

// Запрос ограниченных ресурсов
ResponseEntity<String> response = restTemplate.exchange("http://localhost:8080/api/resource", HttpMethod.GET, entity, String.class);
String resource = response.getBody();

Сервер ресурсов проверяет достоверность и разрешения токена доступа и возвращает ограниченные ресурсы клиенту.

Язык кода:javascript
копировать
// Пример кода для настройки сервера ресурсов
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/api/resource").authenticated();
    }
}
Весь процесс включает аутентификацию пользователя, аутентификацию клиента, а также логику аутентификации и авторизации сервера авторизации. Spring Security OAuth2 предоставляет соответствующие фильтры и процессоры для обработки этой логики.

4.5 Интеграция сторонних поставщиков услуг сертификации и авторизации:

В Spring Security OAuth2 мы можем интегрировать сторонних поставщиков услуг аутентификации и авторизации, таких как Google, Facebook, GitHub и т. д.

5. Практический пример Интеграция входа в систему Интеграция GitHub

1. Настройте файл application.properties и добавьте конфигурацию, связанную с GitHub OAuth2: (не забудьте изменить его на свою собственную учетную запись и другие конфигурации здесь)

Язык кода:javascript
копировать
spring.security.oauth2.client.registration.github.client-id=your-client-id
spring.security.oauth2.client.registration.github.client-secret=your-client-secret
spring.security.oauth2.client.registration.github.scope=user:email
spring.security.oauth2.client.registration.github.redirect-uri=http://localhost:8080/login/oauth2/code/github
spring.security.oauth2.client.provider.github.authorization-uri=https://github.com/login/oauth/authorize
spring.security.oauth2.client.provider.github.token-uri=https://github.com/login/oauth/access_token
spring.security.oauth2.client.provider.github.user-info-uri=https://api.github.com/user

2. Создайте собственную страницу входа (login.html), содержащую кнопку входа в GitHub:

Язык кода:javascript
копировать
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <h2>Login</h2>
    <a href="/login/github">Login with GitHub</a>
</body>
</html>

3. Создайте контроллер для обработки запросов на вход и обратных вызовов:

Язык кода:javascript
копировать
@Controller
public class LoginController {

    @GetMapping("/login")
    public String login() {
        return "login";
    }
    
    @GetMapping("/login/github")
    public RedirectView loginWithGithub() {
        return new RedirectView("/oauth2/authorization/github");
    }
    
    @GetMapping("/login/oauth2/code/github")
    public String handleGithubCallback(@RequestParam("code") String code) {
        // Обработка логики обратного вызова GitHub
        return "redirect:/home";
    }
}

Создайте HomeController для проверки страницы после успешного входа в систему:

Язык кода:javascript
копировать
@Controller
public class HomeController {

    @GetMapping("/home")
    public String home() {
        return "home";
    }
    
}

Создайте класс конфигурации WebSecurityConfigurerAdapter, чтобы включить вход OAuth2:

Язык кода:javascript
копировать
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/login").permitAll()
            .anyRequest().authenticated()
            .and()
            .oauth2Login();
    }
    
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user")
            .password("{noop}password")
            .roles("USER");
    }
    
}

Вот и все!Затем Запустить приложение,и доступhttp://localhost:8080/login, нажмите «Войти». with GitHub» для входа в GitHub.

Вход успешен!

Затем давайте рассмотрим полный случай использования Spring Cloud для интеграции Spring Security OAuth2 для обеспечения безопасной связи между микросервисами.

Мы будем использовать модуль бизнес-отдела торгового центра и серверную часть управления торговыми точками, чтобы объяснить, как использовать Spring Security OAuth2 для реализации безопасной связи между микросервисами.

Текущими примерами являются два микросервиса: сервис торгового центра и серверная служба управления торговцами. Служба торгового центра отвечает за обработку процесса покупок пользователя, а серверная служба управления продавцом используется для управления продуктами продавца и информацией о заказах.

Создание нескольких микросервисов Создайте Spring для сервисов торговых центров и серверных служб управления торговцами. Загрузочный проект. Можно использовать пружину Initializr(https://start.spring.io/) для быстрого создания скелета проекта.

Настройка клиента Spring Security OAuth2 В файлах конфигурации службы торгового центра и фоновой службы управления торговцами (например, application.properties или application.yml) добавьте следующую конфигурацию:

Язык кода:javascript
копировать
spring:
  security:
    oauth2:
      client:
        registration:
          my-client: # идентификатор клиента, можно настроить
            client-id: <your-client-id>
            client-secret: <your-client-secret>
            authorization-grant-type: client_credentials
            scope: read, write
            provider: my-provider # Авторизованное имя, может быть настроено
        provider:
          my-provider:
            token-uri: <authorization-server-token-uri>

Пожалуйста, замените<your-client-id><your-client-secret>и<authorization-server-token-uri>дляфактическая стоимость。Эти значения будут основаны на вашем разрешении.серверразличаться в зависимости от конфигурации。

Шаг 3. Создайте сервер авторизации Создайте отдельный сервер авторизации для выдачи токенов доступа и аутентификации клиентов. Сервер авторизации можно реализовать с помощью Spring Security OAuth2 и Spring Boot.

Сервер авторизации:

Язык кода:javascript
копировать
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("<your-client-id>")
                .secret("{noop}<your-client-secret>")
                .authorizedGrantTypes("client_credentials")
                .scopes("read", "write");
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }
}

Шаг 4. Настройте информацию о сервере авторизации и токен доступа микросервиса. В файлах конфигурации службы торгового центра и фоновой службы управления торговцами настройте информацию о сервере авторизации и токен доступа.

Пример файла конфигурации для сервиса торгового центра:

Язык кода:javascript
копировать
spring:
  security:
    oauth2:
      client:
        registration:
          my-client:
            client-id: <your-client-id>
            client-secret: <your-client-secret>
            provider: my-provider
        provider:
          my-provider:
            token-uri: <authorization-server-token-uri>

Пример файла конфигурации для серверной службы управления продавцами:

Язык кода:javascript
копировать
spring:
  security:
    oauth2:
      client:
        registration:
          my-client:
            client-id: <your-client-id>
            client-secret: <your-client-secret>
            provider: my-provider
        provider:
          my-provider:
            token-uri: <authorization-server-token-uri>

Пожалуйста, замените<your-client-id><your-client-secret>и<authorization-server-token-uri>для您的фактическая стоимость。

Шаг 5. Настройте правила безопасности для микросервисов В службе торгового центра и фоновой службе управления торговцами настройте правила безопасности, включая правила доступа и контроль разрешений.

Пример настройки безопасности службы торгового центра:

Язык кода:javascript
копировать
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .antMatchers("/api/**").authenticated()
                .and()
                .oauth2ResourceServer()
                .jwt();
    }
}

Пример настройки безопасности серверной службы управления торговцами:

Язык кода:javascript
копировать
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .antMatchers("/api/**").authenticated()
                .and()
                .oauth2ResourceServer()
                .jwt();
    }

    @Bean
    public JwtDecoder jwtDecoder() {
        NimbusJwtDecoder jwtDecoder = (NimbusJwtDecoder) JwtDecoders.fromIssuerLocation("<authorization-server-issuer-uri>");
        // Настройте JwtDecoder, включая проверку подписей и т. д.
        return jwtDecoder;
    }
}

Пожалуйста, замените<authorization-server-issuer-uri>для你的Авторизоватьсервер ЭмитентURI。

В приведенном выше примере кода будут настроены правила безопасности внутренней службы управления торговцами.。Все с/public/Запросы, начинающиеся с, будут разрешены без аутентификации,И с/api/Запросы, начинающиеся с。

добавивJwtDecoder bean, мы можем настроить декодер JWT для проверки такой информации, как подпись токена JWT.

Язык кода:javascript
копировать
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.jwt.JwtDecoder;
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;

@Configuration
public class SecurityConfig {

    @Bean
    public JwtDecoder jwtDecoder() {
        String issuerUri = "<authorization-server-issuer-uri>";
        NimbusJwtDecoder jwtDecoder = NimbusJwtDecoder.withJwkSetUri(issuerUri + "/.well-known/jwks.json").build();
        // Настройте JwtDecoder, включая проверку подписей и т. д.
        return jwtDecoder;
    }
}

пожалуйста, измените<authorization-server-issuer-uri>заменятьдля你的Авторизоватьсервер ЭмитентURI。

Импортировать зависимости

Язык кода:javascript
копировать
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-jose</artifactId>
    <version>5.x.x</version>
</dependency>

Таким образом достигается защита безопасного общения в микросервисной системе.

Выше приведен весь контент. Если вы поддерживаете его, оставьте сообщение в службе поддержки.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose