Проектирование и реализация аутентификации, аутентификации и управления разрешениями API в микросервисной архитектуре: обновление

Микросервисы Архитектура алгоритм Spring

Обзор

в предыдущей серии статейПроектирование и реализация аутентификации и управления разрешениями API в микросервисной архитектуреВ , у нас есть четыре статьи, объясняющие реализацию проверки подлинности и управления разрешениями API в микросервисах. Версия Spring Cloud, на которой он был основан в то время, былаDalston.SR4, текущая последняя версия Spring Cloud:Finchley.SR1, соответствующий Spring Boot также был обновлен до2.0.x. Версия Spring CloudFinchleyПо сравнению с предыдущей версией Spring Boot 2.0 произошли серьезные изменения, о конкретных изменениях можно узнать на официальном сайте. На этот раз проект будет обновлен до последней версии, а изменения будут подробно описаны ниже. С предыдущей версией, пожалуйста, переключитесь на1.0-RELEASE.

обновить зависимости

Обновите зависимости Spring Boot до2.0.4.RELEASE.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
</parent>

Обновите зависимость spring-cloud в dependencyManagement доFinchley.RELEASE.

<dependencyManagement>
     <dependencies>
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-dependencies</artifactId>
             <version>Finchley.RELEASE</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
     </dependencies>
</dependencyManagement>

Удалитьspring-cloud-starter-oauth2зависеть, оставить толькоspring-cloud-starter-securityполагаться.

Обновление инструмента

flyway

В проекте мы ввели зависимость flyway для инициализации инкрементного скрипта базы данных.Подробности см.Приложение Flyway для управления версиями базы данных.

докер-контейнер

Чтобы упростить работу с этим проектом, автор предоставляет в проекте сценарий создания докеров. Если docker compose установлен локально, войдите в корневой каталог проекта для выполнения.docker-compose upЗаказ.

Мы можем запустить необходимые нам mysql и redis.

Mybatis и HikariCP

В версии Spring Boot 2.0.X HikariCP выбран в качестве пула соединений с базой данных по умолчанию. Поэтому нам не нужно дополнительно настраивать DataSource.

Конфигурации Mybatis mapper и config-location также представлены в виде конфигурационных файлов, поэтомуDatasourceConfigсильно упростил.

application.yml

spring:
  flyway:
    baseline-on-migrate: true
    locations: classpath:db
  datasource:
    hikari:
      connection-test-query: SELECT 1
      minimum-idle: 1
      maximum-pool-size: 5
      pool-name: dbcp1
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/auth?autoReconnect=true&useSSL=false
    username: ${AUTH_DB_PWD:root}
    password: ${AUTH_DB_USER:_123456_}
#    schema[0]: classpath:/auth.sql
#    initialization-mode: ALWAYS
    type: com.zaxxer.hikari.HikariDataSource
  redis:
    database: 0
    host: localhost
    port: 6379

mybatis:
  mapper-locations: classpath:/mybatis/mapper/*Mapper.xml
  config-location: classpath:/mybatis/config.xml

Обновление класса конфигурации

AuthenticationManagerConfig

Устарело из-за циклических зависимостей, будетAuthenticationManagerКонфигурация размещена вWebSecurityConfigсередина.

WebSecurityConfig

добавлено изAuthenticationManagerConfigизAuthenticationManagerконфигурация.

Поскольку Spring Security5 по умолчаниюPasswordEncoderнетNoOpPasswordEncoder, который необходимо указать вручную. Пароль не зашифрован в исходном проекте авторизации.NoOpPasswordEncoderОн был заброшен и подходит только для использования в тестовой среде.На этот раз мы используемSCryptPasswordEncoderШифровальщик паролей шифрует и расшифровывает пароль, что ближе к использованию производственной линии. Другие алгоритмыPbkdf2PasswordEncoderиBCryptPasswordEncoder.

Что касается алгоритма Scrpyt, то его сложно атаковать.

Алгоритм Scrpyt был разработан известным хакером FreeBSD Колином Персивалем для его службы резервного копирования Tarsnap. Первоначальный замысел заключался в том, чтобы уменьшить нагрузку на ЦП, как можно меньше полагаться на ЦП и использовать время простоя ЦП для вычислений. только вычисление занимает много времени, а также занимает много памяти, что чрезвычайно затрудняет параллельное вычисление нескольких дайджестов, поэтому сложнее использовать радужную таблицу для выполнения атак грубой силы. Scrpyt широко не используется в производственных средах, ему не хватает тщательной проверки и обширной поддержки библиотек. Таким образом, Scrpyt не был популяризирован, но поскольку его зависящий от памяти дизайн особенно соответствовал дизайну непрофессиональных майнинговых машин того времени, он стал основным направлением применения для разработки алгоритмов цифровой валюты.

BCrypt, с другой стороны, существует уже долгое время и также очень безопасен. в весенней безопасностиBCryptPasswordEncoderМетод шифрует пароль с помощью SHA-256 + случайная соль + ключ. Серия SHA — это хеш-алгоритм, а не алгоритм шифрования.Использование алгоритма шифрования означает, что его можно расшифровать (это то же самое, что и кодирование/декодирование), но при использовании хеш-обработки этот процесс необратим.

  1. Шифрование (кодирование): при регистрации пользователя используйте SHA-256 + случайную соль + ключ для хеширования пароля, введенного пользователем, получения хеш-значения пароля и сохранения его в базе данных.
  2. Сопоставление паролей (совпадения): когда пользователь входит в систему, этап сопоставления паролей не расшифровывает пароль (поскольку пароль необратим после обработки хэша), а использует тот же алгоритм для хеширования пароля, введенного пользователем, для получения хеш-значения. пароля. , а затем сравните его со значением хэша пароля, запрошенным из базы данных. Если они совпадают, пользователь ввел правильный пароль.

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

SCryptPasswordEncoder sCryptPasswordEncoder = new SCryptPasswordEncoder();
sCryptPasswordEncoder.encode("frontend");

В этот момент необходимоclient_secretвносить изменения, напримерfrontendизменить на:

$e0801$65x9sjjnRPuKmqaFn3mICtPYnSWrjE7OB/pKzKTAI4ryhmVoa04cus+9sJcSAFKXZaJ8lcPO1I9H22TZk6EN4A==$o+ZWccaWXSA2t7TxE5VBRvz2W8psujU3RPPvejvNs4U=

И измените конфигурацию следующим образом:

    @Autowired
    CustomAuthenticationProvider customAuthenticationProvider;
    @Autowired
    CodeAuthenticationProvider codeAuthenticationProvider;

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(customAuthenticationProvider);
        auth.authenticationProvider(codeAuthenticationProvider);
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

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

ResourceServerConfig

Устаревший, проект аутентификации не включает функции сервера ресурсов.

OAuth2Config

Из-за текущей версииspring-boot-redisсерединаRedisConnectionНедостаток#setметод, используйте непосредственноRedisTokenStoreВозникает следующее исключение:

java.lang.NoSuchMethodError: org.springframework.data.redis.connection.RedisConnection.set([B[B)V

Так настроитьCustomRedisTokenStoreкласс, такой же, как код RedisTokenStore, за исключением того, чтоRedisConnection#setВызов метода заменен наRedisConnection#stringCommands#set,Следующее:

    conn.stringCommands().set(accessKey, serializedAccessToken);
    conn.stringCommands().set(authKey, serializedAuth);
    conn.stringCommands().set(authToAccessKey, serializedAccessToken);

Полный код смотрите по адресу GitHub в конце статьи.

Проверка результата

После вышеуказанного обновления мы проверим следующие конечные точки API:

  • Режим пароля для получения токена: /oauth/token?grant_type=password
  • Обновить токен: /oauth/token?grant_type=refresh_token&refresh_token=...
  • Проверить токен: /oauth/check_token
  • выход: /выход
  • Авторизоваться: /oauth/авторизовать
  • Режим кода авторизации для получения токена: /oauth/token?grant_type=authorization_code

Результаты не отображаются, и их можно использовать в обычном режиме.

резюме

Служба аутентификации OAuth является базовой службой в микросервисной архитектуре. После того, как проект был выпущен, он привлек внимание многих студентов. Многие студенты также высказывали свои сомнения или предложения по этому поводу после присоединения к группе QQ, а также обсуждали и решали сомнения вместе. С обновлением версии Spring Boot и Spring Cloud автор вовремя обновил и этот проект, надеясь помочь детской обуви. Планируемая автором книга о приложениях Spring Cloud будет опубликована в этом месяце, в части о Spring Cloud Security есть подробный анализ, вы можете поддержать подлинную версию.

Адрес источника этой статьи:
Гитхаб:GitHub.com/Доступный ETS2012/A…
Облако кода:git ee.com/can-ets/au-th-…

Подписывайтесь на свежие статьи, приглашаю обратить внимание на мой публичный номер

微信公众号

Связанное Чтение

Проектирование и реализация аутентификации и управления разрешениями API в микросервисной архитектуре

Ссылаться на

Прошлое и настоящее алгоритма scrypt (изучение блокчейна с нуля 192)