Spring Security 5.1.0 @Query() для findAll() с пользовательским основным объектом, выдающим 500 внутренних ошибок сервера
Я создал @Filter
и включил его в мою цепочку фильтров в моем WebSecurityConfig
класс как таковой
httpSecurity
.addFilterBefore(new JWTFilter(jwtService, exceptionController), UsernamePasswordAuthenticationFilter.class);
В моем JWTFilter
Я установил SecurityContextHolder
разрешение на UsernamePasswordAuthenticationToken
с пользовательским объектом UserInfo
в качестве таких
UserInfo userInfo = this.service.getUserFromToken(token);
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userInfo, null, authorities);
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(req));
SecurityContextHolder.getContext().setAuthentication(authentication);
Я пытаюсь использовать язык выражения в моем InvoiceRepository
отфильтровать мой findAll()
мой вошедший в систему пользователь с запросом как таковым
@Query("select i from Invoice i where supplyId in ?#{ principal?.supplier.supplyId }")
Iterable<Invoice>findAll()
Это ошибка, которую я получаю
java.lang.AbstractMethodError: org.springframework.security.data.repository.query.SecurityEvaluationContextExtension.getFunctions()Ljava/util/Map;
Я проверил, используя @Controller
чтобы увидеть, если SecurityContextHolder.getContext().getAuththentication()
готовится и это так. Это возвращает мой UsernamePasswordAuthenticationToken
объект с моим основным приложенным и может быть приведен к UserInfo
,
Я включил этот класс
@Configuration
@EnableAutoConfiguration
public class SecurityConfiguration {
@Bean
EvaluationContextExtension securityExtension() {
return new SecurityEvaluationContextExtension();
}
}
1 ответ
Задача решена. Как упоминал М. Дейнм, я смешивал разные версии зависимостей Spring-Boot и Spring-Security.
Я удалил все зависимости Spring-Security, добавил последнюю версию spring-boot-starter-security
чтобы соответствовать моей версии spring-boot
и я добавил spring-security-data 5.0.8.RELEASE
которые соответствовали версиям с пружинной защитой, spring-boot-starter-security
осуществлял. spring-security-data
автоматически настраивает SecurityEvaluationContextExtension
без необходимости создавать свои собственные SecurityConfiguration
учебный класс. С SecurityConfiguration
оставил на месте, выдавало ошибку, что было два SecurityEvaluationContextExtensions
, удаляя SecurityEvaluationContextExtension
от SecurityConfiguration
решил эту проблему