Я пытаюсь аутентифицировать пользователя с помощью ключа API, отправленного в заголовке, без каких-либо данных пользователя через вход в систему. Затем я получаю исключение приведения, потому что я пытаюсь преобразовать основной объект в строку.
Я попытался получить заголовок в классе SecurityConfig, но это не сработало. Я также попытался получить его в пользовательском фильтре, который в любом случае соответствует текущему решению.
@Bean
public APIKeyAuthFilter authFilter() {
APIKeyAuthFilter filter = new APIKeyAuthFilter(principalRequestHeader);
filter.setAuthenticationManager(authentication -> {
String principal = (String) authentication.getPrincipal();
if (!principalRequestValue.equals(principal)){
throw new BadCredentialsException("The API key was not found or not the expected value.");
}
authentication.setAuthenticated(true);
return authentication;
});
return filter;
}
Я ожидаю, что смогу получить заголовок и проверить значение для сравнения с существующим ключом, но я получаю это исключение "message": "io.undertow.servlet.util.IteratorEnumeration cannot be cast to java.lang.String",
"trace": "java.lang.ClassCastException: io.undertow.servlet.util.IteratorEnumeration cannot be cast to java.lang.String\n\tat uk.co.nesistec.contractpicturechallenge.config.APISecurityConfig.lambda$authFilter$0(APISecurityConfig.java:46)
Я получил пример кода из этого другого вопроса. Защита API Spring Boot с помощью ключа и секрета API




Я обнаружил, что все, что мне нужно, это еще один класс для регистрации фильтра безопасности.
import org.springframework.security.web.context
.AbstractSecurityWebApplicationInitializer;
public class SpringSecurityInitializer
extends AbstractSecurityWebApplicationInitializer {
//no code needed
}
Это полный пример для этого сценария для всех, кому это понадобится. Spring