我的rest控制器中有一个post端点,无需身份验证/授权即可访问。它是在WebSecurityConfigurerAdapter中配置的,如下所示:
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/api/v1/user");
}
端点对输入数据进行验证(由注释javax.validation.Valid提供)。当我发送无效数据时,我收到401而不是400的响应。在发送默认的spring boot 400消息的安全端点中不存在此问题。
在调试过程中,我发现在处理MethodArgumentNotValidException(在控制器中发生验证错误时引发)时,将执行WebExpressionVoter并返回值-1,这意味着“访问被拒绝”。如何配置我的应用程序以忽略对公共端点的安全性检查?
我知道使用ControllerAdvice进行异常处理是一种选择,但是是否可能有默认的400条消息?
在此先感谢您的提示!
编辑:
Security filter chain: [
WebAsyncManagerIntegrationFilter
SecurityContextPersistenceFilter
HeaderWriterFilter
LogoutFilter
OAuth2AuthenticationProcessingFilter
RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter
AnonymousAuthenticationFilter
SessionManagementFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
]
答案 0 :(得分:0)
使用webSecurity.ignoring()
将导致对该URL的请求完全绕过整个安全过滤器链。因此,有趣的是,WebExpressionVoter
仍会加入这些被忽略的URL。
所以,我猜有以下可能性:
/api/v1/user
将被重定向到其他受保护的URL。
您正在考虑antMatchers("/api/v1/user")
会匹配/api/v1/user
下的所有URL,例如/api/v1/user/1
。但是,它仅匹配/api/v1/user
。
要忽略/api/v1/user
下的所有URL,应使用:
web.ignoring().antMatchers("/api/v1/user/**");
答案 1 :(得分:0)
好,我找到了解决方法。我不知道为什么,但是当发生异常时,对此URL会有另一个POST请求:/ error。当我将此网址添加到我的忽略列表中后,它便开始工作。所以我的配置看起来像这样:
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/api/v1/user", "/error/**")
}
@Ken Chan感谢您提供有关调试过滤器的信息!至关重要。