在具有生产身份验证逻辑的 MockMVC 中使用 springSecurity() 时的@WithUserDetails 和@WithMockUser
@WithUserDetails and @WithMockUser when using springSecurity() in MockMVC with production authentication logic
经过一段时间的调试,我发现@WithUserDetails
和@WithMockUser
伪造了SecurityContext
,但没有添加任何假的Authentication Provider
,以防万一与生产代码一起使用,
SecurityContextHolder
填充了假 SecurityContext
包含我们的虚拟 Authentication
对象
过滤器发生,所有产品认证系统失败,因为 ProviderManager
中没有额外的 AbstractUserDetailsAuthenticationProvider
,并且在最终错误时,SecurityContext
被清除,所以我松开测试模拟身份验证设置...
那么..是否有任何内置方法可以方便地使用测试 @With
.. 生产授权代码上的注释?这是一个错误吗?我可以更改之前要点的顺序,以便至少稍后进行测试准备吗?
正确,@WithUserDetails
和 @WithMockUser
用于模拟已通过身份验证的请求。
因此,所有进行身份验证的过滤器不应在此时触发。如果您的过滤器正在触发,那么您可以重写过滤器以在身份验证已经发生时考虑用例。
另一种选择是重写测试以按照您的应用程序期望的方式进行身份验证。
经过一段时间的调试,我发现@WithUserDetails
和@WithMockUser
伪造了SecurityContext
,但没有添加任何假的Authentication Provider
,以防万一与生产代码一起使用,
SecurityContextHolder
填充了假SecurityContext
包含我们的虚拟Authentication
对象过滤器发生,所有产品认证系统失败,因为
ProviderManager
中没有额外的AbstractUserDetailsAuthenticationProvider
,并且在最终错误时,SecurityContext
被清除,所以我松开测试模拟身份验证设置...
那么..是否有任何内置方法可以方便地使用测试 @With
.. 生产授权代码上的注释?这是一个错误吗?我可以更改之前要点的顺序,以便至少稍后进行测试准备吗?
正确,@WithUserDetails
和 @WithMockUser
用于模拟已通过身份验证的请求。
因此,所有进行身份验证的过滤器不应在此时触发。如果您的过滤器正在触发,那么您可以重写过滤器以在身份验证已经发生时考虑用例。
另一种选择是重写测试以按照您的应用程序期望的方式进行身份验证。