Проблема безопасности Spring, связанная с выражениями SpEL, после перехода с Spring boot 2 на Spring Boot 3JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Проблема безопасности Spring, связанная с выражениями SpEL, после перехода с Spring boot 2 на Spring Boot 3

Сообщение Anonymous »

Мне пришлось перенести приложение Spring Boot с Spring Boot 2 на Spring Boot 3. Наряду с этим изменением мне пришлось перейти с javax на jakarta. Одним из основных изменений стал перенос функций безопасности с WebSecurityConfigurerAdapter на SecurityFilterChain. Во время процесса миграции я столкнулся с несколькими трудностями, и среди этих трудностей мне так и не удалось решить один случай, связанный с SpEL.
Как это было обработано в Spring Boot 2 :
(API доступа ожидает строковый аргумент)

Код: Выделить всё

  private ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry mvcMatchers(
ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry) {
final List securedUrls = securityProperties.getSecured();

securedUrls.forEach(entry -> {
if (entry.getMethods() != null && !entry.getMethods().isEmpty()) {
entry.getMethods().stream().forEach(httpMethod -> {
ExpressionUrlAuthorizationConfigurer.AuthorizedUrl authorizedUrl = registry
.mvcMatchers(httpMethod, entry.getPatterns().toArray(new String[]{}));
authorizedUrl.fullyAuthenticated();
Optional.ofNullable(entry.getAccess()).ifPresent(spEL -> authorizedUrl.access(spEL));
});
}
});
return registry;
}
API доступа был изменен в весенней загрузке 3. Теперь для него требуется аргумент AuthorizationManager Manager. Я попытался преобразовать выражение String SpEL в требуемый тип аргумента и продолжил, но это не сработало должным образом.
Моя попытка Spring Boot 3 решить проблему проблема:

Код: Выделить всё

  private void configureRequests(AuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry requests) {
final List securedUrls = securityProperties.getSecured();
if (securedUrls != null) {
securedUrls.forEach(entry -> {
if (entry.getMethods() != null && !entry.getMethods().isEmpty()) {
entry.getMethods().forEach(httpMethod -> {
var authorizedUrl = requests.requestMatchers(httpMethod, entry.getPatterns().toArray(new String[]{}));
authorizedUrl.fullyAuthenticated();
Optional.ofNullable(entry.getAccess()).ifPresent(spEL -> {
var manager = new WebExpressionAuthorizationManager(spEL);
authorizedUrl.access(manager);
});
});
}
});
}
requests.anyRequest().permitAll();
}
В Spring Boot 2 было очень легко предоставить выражение String SpEL, и оно очень хорошо справилось с самим собой. Ниже приведен один из таких примеров:

Код: Выделить всё

hasAuthority('role1') || hasAuthority('role2') || hasAuthority('role3') || request.getHeader('header_name') == 'header_value')
Мне не хватает этой простой конфигурации с Spring Boot 3, и мне пришлось найти обходное решение. Мое решение заключалось в том, чтобы вручную выполнить настройку выражения SpEL и включить безопасность, как показано ниже:

Код: Выделить всё

  requests.requestMatchers(httpMethod, entry.getPatterns().toArray(new String[]{}))
.hasAuthority(authority);
Это большая работа, и очень сложно справиться со сложными выражениями SpEL. Меня беспокоит то, что если было так легко предоставить выражение SpEL в весенней загрузке 2, то не так уж сложно сделать то же самое в весенней загрузке 3. Я думаю, что что-то упускаю, и очень ценю, если кто-нибудь поможет мне решить эту проблему. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/791 ... -spring-bo
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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