Почему вы используете устаревший Spring Security OAuth?

Spring Boot Java EE

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

Когда вы выбираете зависимости OAuth2, вы также можете запутаться.Есть несколько мест на выбор:

Так какой из них правильный выбрать? В чем разница между этими разными зависимостями? Сегодня Brother Song расскажет вам о недовольствах и недовольствах по поводу OAuth2 в Spring Security.

предисловие

Давайте кратко представим процесс разработки OAuth2 в среде Spring.

Около десяти лет назад Spring представил Spring Security OAuth, проект с открытым исходным кодом, управляемый сообществом, в портфолио Spring. Сегодня он превратился в зрелый проект, поддерживающий большую часть спецификации OAuth, в том числе资源服务器,客户端а также授权服务器Ждать.

Теперь он стал основой UAA (User Account and Authentication Server). Проект Spring Security OAuth стал шаблонным проектом, который доказывает, что сообщество Spring может отлично справляться со своей задачей.

Однако в начале проекта есть некоторые проблемы:

  1. OAuth делается очень рано, разработчики не могут предвидеть будущие изменения и то, как эти коды будут использоваться в конечном итоге, в результате чего во многих проектах Spring предоставляет собственную поддержку OAuth, которая обеспечивает поддержку фрагментации OAuth2.
  2. Самые ранние проекты OAuth поддерживали как OAuth1.0, так и OAuth2.0, теперь OAuth1.0 больше не используется и от него можно отказаться.
  3. Теперь у нас есть больше библиотек на выбор, и мы можем разрабатывать на основе этих библиотек, чтобы лучше поддерживать новые вещи, такие как JWT.

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

Однако в процессе перезаписи произошло много перипетий.

2018.01.30

Все должно начаться 30 января 2018 года.

В тот же день Spring официально выпустила уведомление, в котором говорилось, что существующая поддержка OAuth2 будет постепенно прекращена, а поддержка OAuth2.0 следующего поколения будет встроена в Spring Security5.

Почему должно быть так?

Как мы все знаем, OAuth2 — это просто протокол, и среда Spring реализует этот протокол через код.

В то время реализация OAuth2 была запутанной (эта путаница существует и сегодня), а реализация OAuth2 была предусмотрена в Spring Security OAuth, Spring Cloud Security, Spring Boot 1.5.x и последней на тот момент Spring Security5.x.

Чтобы когда разработчикам нужно было использовать OAuth2, они должны были спросить, какая зависимость подходит? Уже есть три места, которые обеспечивают поддержку OAuth2, это достаточно запутанно, зачем продолжать предоставлять реализации в последней версии Spring Security 5.x?

слишком грязный!

Итак, Spring официально решила, что необходимо объединить поддержку OAuth2.0 в один проект, чтобы предоставить пользователям четкий выбор и избежать возможной путаницы, а документация по разработке OAuth2 также будет переписана, чтобы облегчить разработчикам обучение. Все решения будут приниматься в Spring Security 5, обеспечивая поддержку OAuth 2.0 следующего поколения.

С тех пор проект Spring Security OAuth официально находится в режиме обслуживания. Исправления ошибок/безопасности будут официально предоставлены в течение как минимум 1 года, и будут рассмотрены второстепенные функции, но основные функции не будут добавлены. При этом все функции в Spring Security OAuth рефакторингуются в Spring Security 5.x.

Честно говоря, это было мудрое решение, которое в то время не вызвало большой негативной реакции. А вот дальше все не так гладко.

2019.11.14

Время до 2019.11.14.

Сегодня чиновник выпустил еще одно уведомление.

Во-первых, процесс миграции Spring Security OAuth на Spring Security 5.x очень гладкий.Большая часть работы по миграции уже завершена.Остальное будет перенесено в версии 5.3.В процессе миграции было добавлено много новых функций , включая поддержку OpenID Connect1.0

Затем разговор изменился, и он сказал то, что многим трудно принять, а именно:Поддержка серверов авторизации больше не предоставляется(Если маленькие друзья не понимают, что такое сервер авторизации, вы можете публично ответить немного дождя Нет. Южный ТайваньOAuth2, есть учебник OAUTT2, написанный песней GE).

Причин не предоставления чиновник назвал две:

  1. В 2019 году будет доступно большое количество коммерческих серверов лицензий и серверов лицензий с открытым исходным кодом.
  2. Сервер авторизации построен с использованием библиотеки, и Spring Security, как фреймворк, для этого не подходит.

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

2020.04.15

Сегодня чиновник выпустил еще одно уведомление.

На этот раз был анонсирован проект Spring Authorization Server. Это управляемый сообществом проект под руководством команды безопасности Spring, посвященный обеспечению поддержки сервера авторизации сообществу Spring.

Чиновник прислушался к мнению сообщества и решил продолжить предоставление сервера авторизации.

В этот раз я просто анонсировал его, что бы успокоить настроение сообщества, но проект еще не получил развития.

2020.08.21

Spring Authorization Server 0.0.1 официально выпущен!

При этом был озвучен адрес исходного кода проекта:GitHub.com/spring-pro — это…

В этой версии в основном предусмотрены следующие функции:

  • Предоставление кода авторизации OAuth 2.0  — RFC 6749
  • Предоставление учетных данных клиента OAuth 2.0 — RFC 6749
  • Веб-токен JSON (JWT)  — RFC 7519
  • Веб-подпись JSON (JWS)  — RFC 7515
  • Веб-ключ JSON (JWK)  — RFC 7517
  • Управление ключами для предоставления ключей при подписании JWT (JWS)

Другие функции находятся в стадии разработки.

Вот как OAuth2 изменился за последние годы.

вернуться к вопросу

Вернемся к исходному вопросу.

Что делать, если класс истекает?

Срок действия класса истек, потому что старый способ написания больше не поддерживается. Сонг Гэ привел простой пример. Раньше мы определяли сервер ресурсов следующим образом:

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    @Bean
    RemoteTokenServices tokenServices() {
        RemoteTokenServices services = new RemoteTokenServices();
        services.setCheckTokenEndpointUrl("http://localhost:8080/oauth/check_token");
        services.setClientId("javaboy");
        services.setClientSecret("123");
        return services;
    }
    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.resourceId("res1").tokenServices(tokenServices());
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/admin/**").hasRole("admin")
                .anyRequest().authenticated();
    }
}

Теперь, после перехода на Spring Security 5.x, мы определяем его так:

@Configuration
public class MyResourceServer extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .oauth2ResourceServer()
                .opaqueToken()
                .introspectionUri("http://localhost:8080/oauth/check_token")
                .introspectionClientCredentials("javaboy", "123");
    }
}

Эти две части кода работают одинаково. Последний в настоящее время является новейшим методом записи, и нет проблем с истечением срока действия.

Какую зависимость выбрать

Теперь вы уже знаете, почему существует много разных зависимостей.Старый способ записи в Spring Cloud Security OAuth2 не приведет к истечению срока действия, но он также поддерживает новый способ записи.В любом случае рекомендуется использовать новый способ записи, рано или поздно.Измени его.

В апреле Song Ge опубликовал руководство по OAuth2, которое в то время было основано на Spring Cloud Security OAuth2. В нем использовался старый способ написания, но не было подсказки о сроке действия. Заинтересованные партнеры могут взглянуть (за кулисами публичная учетная запись) Ответ на OAuth2), независимо от того, новый или старый, если вы знаете один из них, легко начать работу с другим.

Конечно, позже я также обновлю набор руководств по OAuth2 последней версией Spring Security5.x, всем желаю обратить внимание~