我有很多需要经过身份验证的请求的API端点,以及一些允许任何请求的端点。我希望Spring Security默认阻止匿名请求,但是让我覆盖它:
aHttpSecurity.authorizeRequests().anyRequest().authenticated()
...
@PreAuthorize("permitAll()")
@RequestMapping("/foobar")
public ResponseEntity<FooBar> get() {
...
}
不幸的是,这不起作用:/foobar
输出401.知道怎么做?
答案 0 :(得分:2)
@PreAuthorize
只是一个注释,它包装方法以检查用户是否可以执行带注释的方法。它不仅适用于控制器。
当你有http请求时,首先请求通过一些spring安全过滤器,当你写.anyRequest().authenticated()
时,你就不会去一些包装好的控制器端点。
所以,如果你有几个端点可以将它排除在外
aHttpSecurity.authorizeRequests()
.antMatchers(HttpMethod.GET, "/foobar/**").permitAll()
.antMatchers("/**").authenticated()
并删除@PreAuthorize("permitAll()")
答案 1 :(得分:1)
Spring Security有两个级别的安全性。
过滤级别和方法级别。
过滤级别适用于URL,如果没有配置访问URL,则会拒绝使用401或403进行访问。这由FilterSecurityInterceptor
处理方法级别通常用作授权谁可以访问方法以及他/她可以操作的操作或对象的第二级防御。这由MethodSecurityInterceptor
处理