我有以下安全配置:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class SecurityConfigurer extends WebSecurityConfigurerAdapter {
// @formatter:off
@Override
public void configure(final HttpSecurity http) throws Exception {
http.headers().frameOptions().disable()
.and()
.csrf().disable()
.authorizeRequests()
.antMatchers("/api/test/**").authenticated()
.antMatchers("/**").permitAll()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
该控制器:
@RestController
public class MyController {
@GetMapping("")
@PreAuthorize("hasRole('ROLE_USER')")
public String hello() {
return "Hello world!";
}
@GetMapping("/api/test")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public String helloTest(Principal principal) {
System.out.println(principal.toString());
return "Hello test world!";
}
}
两种控制器方法都有一个 @PreAuthorize
注解。在安全配置中,我需要 /api/test/**
端点应该是安全的,而其余端点应该是匿名的。
然而,当我测试给定的控制器时,打开 http://localhost:8080
我明白了 401 Unauthorized
因为 @PreAuthorize("hasRole('ROLE_USER')")
注解,而我希望它不安全( .antMatchers("/**").permitAll()
).
tl:dr-我希望“全局”配置覆盖 @PreAuthorize()
注解。
为什么?因为我想设定 .antMatchers("/api/test/**").authenticated()
离别 application.properties
因此,如果我将值更改为“/api/test/hello/**”,那么我希望 helloTest
方法对匿名用户可用,而无需检查所有控制器并删除 @PreAuthorize()
到处都有注解,希望我能找到。提前谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!