io.undertow.servlet.util.IteratorEnumeration无法转换为java.lang.String

时间:2019-06-04 11:40:07

标签: spring-boot spring-security java-8

我正在尝试通过标头中发送的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)

我从另一个问题中得到了示例代码。 Securing Spring Boot API with API key and secret

1 个答案:

答案 0 :(得分:0)

我发现我所需要的只是注册安全过滤器的另一个类。

import org.springframework.security.web.context
            .AbstractSecurityWebApplicationInitializer;
public class SpringSecurityInitializer
            extends AbstractSecurityWebApplicationInitializer {
    //no code needed
}

对于需要此功能的任何人,这是此方案的完整示例。 Spring