即使使用@PreAuthorize(" permitAll()")

时间:2016-07-22 08:32:10

标签: java spring spring-mvc spring-security

我有很多需要经过身份验证的请求的API端点,以及一些允许任何请求的端点。我希望Spring Security默认阻止匿名请求,但是让我覆盖它:

aHttpSecurity.authorizeRequests().anyRequest().authenticated()

...

@PreAuthorize("permitAll()")
@RequestMapping("/foobar")
public ResponseEntity<FooBar> get() {
  ...
}

不幸的是,这不起作用:/foobar输出401.知道怎么做?

2 个答案:

答案 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

处理