Spring Boot + CometD + CorFilter:在SecurityContext中找不到身份验证对象

时间:2019-06-14 03:50:15

标签: spring-boot spring-security cors

我的项目是Spring Boot 1.5.19和Spring Security 4.2.6和CometD 3.0.9。 在UI端日志是:CometD订阅失败。 在服务后端日志中是:org.springframework.security.authentication.AuthenticationCredentialsNotFoundException:在SecurityContext中找不到身份验证对象 位置是CorsFilter.java:chain.doFilter(req,resp);

此错误似乎并不影响功能,登录和握手以及元/连接始终可以。但是,Cometd订阅失败,并且页面始终刷新,然后将返回新数据。这不是我想要的我想获取实时数据。我不知道SecurityContext Error是否是造成此问题的原因。

@Component
@Order(0)
public class CorsFilter implements Filter{

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) resp;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, Content-Type, Authorization, credential, X-XSRF-TOKEN");

        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, resp);
        }

    }

    @Override
    public void destroy() {

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }
}

希望没有错误,并且CometD实时数据成功运行。

1 个答案:

答案 0 :(得分:0)

这只是我的错。 在CometdAuthenticator

@Autowired
private List<AbstractCometDSubscribeVoter> voters = Collections.emptyList();

添加@Autowired,一切正常。