WebAuthenticationDetails是否有开箱即用的测试支持?

时间:2017-02-13 09:46:16

标签: spring spring-security

我们的一些访问选民需要访问身份验证的WebAuthenticationDetails。

Spring Security是否提供开箱即用的支持,以便在测试用例中提供和关联WebAuthenticationDetails和身份验证?我注意到@WithMockUser或@WithUserDetails没有填写WebAuthenticationDetails例如。

在测试中实施此功能的推荐和/或最佳方法是什么?

如果没有标准方式,我是否需要提供自己的RequestPostProcessor?

我正在使用Spring Security 4.1.4。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题,现在我使用自定义的RequestPostProcessor,如:

static RequestPostProcessor webAuthenticationDetails() {
    return new WebAuthenticationDetailsPostProcessor();
}

static RequestPostProcessor webAuthenticationDetails(String remoteIpAddress) {
    return new WebAuthenticationDetailsPostProcessor(remoteIpAddress);
}

private static class WebAuthenticationDetailsPostProcessor implements RequestPostProcessor {

    private final String remoteIpAddress;

    public WebAuthenticationDetailsPostProcessor() {
        this(null);
    }

    public WebAuthenticationDetailsPostProcessor(String remoteIpAddress) {
        this.remoteIpAddress = remoteIpAddress;
    }

    @Override
    public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) {
        SecurityContext context = SecurityContextHolder.getContext();
        if (context != null) {
            Authentication authentication = context.getAuthentication();
            if (authentication instanceof AbstractAuthenticationToken) {
                if (remoteIpAddress != null) {
                    request.setRemoteAddr(remoteIpAddress);
                }
                ((AbstractAuthenticationToken) authentication).setDetails(new WebAuthenticationDetails(request));
            }
        }
        return request;
    }
}

也许这样的事情应该是Spring Security Test的一部分?