С помощью Spring Boot 3 и Spring Security 6 вы можете добавить несколько типов безопасности к одному и тому же маршруту?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 С помощью Spring Boot 3 и Spring Security 6 вы можете добавить несколько типов безопасности к одному и тому же маршруту?

Сообщение Anonymous »


Миграция приложения Spring Boot 2 в Spring Boot 3/Spring Security 6. В моей предыдущей конфигурации было два файла SecurityConfiguration с Order(2) с базовой аутентификацией (LDAP) и Order(3) с OAuth2, основанными на этом сообщении о переполнении стека.

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

В настоящее время он просто использует вариант Order(2) и никогда не пробует вариант Order(3), даже если видит, что он не соответствует.

Пример: Order(2) — это базовая аутентификация, Order(3) — это OAuth. Если я отправлю токен на предъявителя, он просто скажет: Соответствие не найдено. Использование точки входа по умолчанию org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint. Если я отправлю базовую аутентификацию, все будет работать нормально.

Можно ли решить эту проблему обычными способами?

Просто ищу базовые примеры/руководства, с которыми можно было бы работать, но до сих пор не нашел ничего, что позволяло бы использовать описанное выше по одному и тому же маршруту. Изменение маршрутов для меня не вариант.

Предыдущий код (удалены некоторые особенности):

Базовая аутентификация – LDAP

@Configuration @EnableWebSecurity @Заказ(2) общественный класс SecurityConfiguration расширяет WebSecurityConfigurerAdapter { частный окончательный LdapProperties ldapProps; public SecurityConfiguration(final LdapProperties ldapProps) { this.ldapProps = ldapProps; } @Override protected void configure(HttpSecurity http) выдает исключение { http.requestMatcher(новый LdapBasicAuthenticationRequestMatcher()) .authorizeRequests() .antMatchers(HttpMethod.OPTIONS, "/**").denyAll() .antMatchers(HttpMethod.GET, "/**").permitAll() .and().httpBasic() .and().csrf().disable(); } @Autowired public void configureGlobal (AuthenticationManagerBuilder auth) { // Удалено — здесь есть некоторые специфические настройки ldap. } частный статический класс LdapBasicAuthenticationRequestMatcher реализует RequestMatcher { @Override общедоступные логические совпадения (запрос HttpServletRequest) { Строка auth = request.getHeader("Авторизация"); return (auth != null && auth.startsWith("Basic")); } } } OAuth2 – CryptoService предназначен для расшифровки KMS

@Order(3) @Конфигурация @EnableResourceServer публичный класс OAuth2SecurityConfiguration расширяет ResourceServerConfigurerAdapter { частная статическая финальная строка OAUTH2_READ_SCOPE = "#oauth2.hasScope('my_read_scope')"; частный окончательный OAuth2Properties oAuth2Properties; частный конечный CryptoService cryptoService; @SuppressWarnings("PMD.ImmutableField") @Autowired (обязательно = ложь) @Qualifier("oauth2StatelessSecurityContext") частное логическое значение без сохранения состояния = Boolean.TRUE; @Autowired частный TokenStore tokenStore; public OAuth2SecurityConfiguration(final OAuth2Properties oAuth2Properties, Final CryptoService cryptoService) { this.oAuth2Properties = oAuth2Properties; this.cryptoService = cryptoService; } @Override public void configure(final HttpSecurity http) выдает исключение { http.requestMatcher(новый OAuth2AuthenticationRequestMatcher()) .authorizeRequests() .antMatchers(HttpMethod.OPTIONS, "/**").denyAll() .antMatchers(HttpMethod.GET, "/**").access(OAUTH2_READ_SCOPE) .and().httpBasic() .and().csrf().disable(); } @Override public void configure (окончательная конфигурация ResourceServerSecurityConfigurer) { config.resourceId (cryptoService.decrypt (oAuth2Properties.getAudience ())); config.tokenServices(tokenServices()); config.stateless(без гражданства); } /** * @return новый JWTTokenStore * @throws JwtAccessTokenConverterException при возникновении исключения */ @Бин public TokenStore tokenStore() { вернуть новый JwtTokenStore(accessTokenConverter()); } /** * @return JwtAccessTokenConverter * @throws RuntimeException при возникновении исключения * @throws JwtAccessTokenConverterException при возникновении исключения */ @Бин public JwtAccessTokenConverter accessTokenConverter() выдает JwtAccessTokenConverterException { окончательный преобразователь JwtAccessTokenConverter = новый JwtAccessTokenConverter(); попробуйте (InputStream = новый URL(oAuth2Properties.getPublicKey().getUrl()).openStream()) { окончательный сертификат сертификата X509 = (X509Certificate) CertificateFactory.getInstance("X509").generateCertificate(is); //Устанавливаем алгоритм SHA384withRSA, поскольку именно его Ping использует для подписи токена. окончательный верификатор RsaVerifier = новый RsaVerifier((RSAPublicKey) cert.getPublicKey(), "SHA384withRSA"); Converter.setVerifier(верификатор); } catch (Исключение е) { выдать новое JwtAccessTokenConverterException( "JwtAccessTokenConverter выдал исключение: ", e); } обратный преобразователь; } /** * @return DefaultTokenServices */ @Бин @Начальный общественный DefaultTokenServices tokenServices() { окончательный DefaultTokenServices defaultTokenServices = новый DefaultTokenServices(); defaultTokenServices.setTokenStore(tokenStore); вернуть defaultTokenServices; } частный статический класс OAuth2AuthenticationRequestMatcher реализует RequestMatcher { @Override общедоступные логические совпадения (запрос HttpServletRequest) { Строка auth = request.getHeader("Авторизация"); возврат (аутентификация != ноль && auth.startsWith("Носитель"); } } } Новый код (по крайней мере, те части, которые были изменены)

Базовая аутентификация – LDAP

@Configuration @Заказ(2) общественный класс SecurityConfiguration { частный окончательный LdapProperties ldapProps; public SecurityConfiguration(final LdapProperties ldapProps) { this.ldapProps = ldapProps; } @Бин public SecurityFilterChain filterChain(HttpSecurity http) выдает исключение { вернуть http .httpBasic(httpBasic -> новый LdapBasicAuthenticationRequestMatcher()) .csrf(AbstractHttpConfigurer::отключить) .authorizeHttpRequests(авторизатор -> авторизатор .requestMatchers(AntPathRequestMatcher.antMatcher(HttpMethod.OPTIONS, "/**")).denyAll() .requestMatchers(AntPathRequestMatcher.antMatcher(HttpMethod.GET, "/**")).authenticated()).build(); } // Остальная часть этого класса соответствует старому } OAuth2 — он реализует внутреннюю библиотеку, которая обрабатывает за меня предыдущие данные JWT.
@Order(3) @Конфигурация публичный класс OAuth2SecurityConfiguration реализует InternalSecurityAdapter { частная статическая конечная строка OAUTH2_READ_SCOPE = «my_read_scope»; общественный OAuth2SecurityConfiguration() {} @Override public void configure(final HttpSecurity http) выдает исключение { http .csrf(AbstractHttpConfigurer::отключить) .httpBasic(httpBasic -> new OAuth2AuthenticationRequestMatcher()) // Я знаю, что это, вероятно, неправильно, я просто пытаюсь заставить что-нибудь работать .authorizeHttpRequests(авторизатор -> авторизатор .requestMatchers(AntPathRequestMatcher.antMatcher(HttpMethod.OPTIONS, "/**")).denyAll() .requestMatchers(AntPathRequestMatcher.antMatcher(HttpMethod.GET, "/**")).hasAuthority(OAUTH2_READ_SCOPE) .requestMatchers(AntPathRequestMatcher.antMatcher(HttpMethod.GET, "/**")).hasRole(OAUTH2_READ_SCOPE)); } частный статический класс OAuth2AuthenticationRequestMatcher реализует RequestMatcher { @Override общедоступные логические совпадения (запрос HttpServletRequest) { Строка auth = request.getHeader("Авторизация"); System.out.println(запрос); return (auth != null && auth.startsWith("Bearer"); } } }
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Страницы ASP.NET Core 8 Razor, привязывающие несколько моделей страниц к одному маршруту
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Spring Boot 3.3.2 с проблемой Spring Security 6.3.1 (нет поддержки auth0-spring-security-api с Spring Framework 3.3.2)
    Anonymous » » в форуме JAVA
    0 Ответы
    94 Просмотры
    Последнее сообщение Anonymous
  • Vue.js прокрутит страницу до верха по тому же маршруту
    Гость » » в форуме Javascript
    0 Ответы
    28 Просмотры
    Последнее сообщение Гость
  • Ваадин перейти к тому же маршруту с разными параметрами
    Anonymous » » в форуме JAVA
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Ваадин перейти к тому же маршруту с разными параметрами
    Anonymous » » в форуме JAVA
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»