在我的控制器中,我有两个端点,其中一个是安全的,另一个是公共的:
@GetMapping("/public")
public String getPublic() {
return "public";
}
@PreAuthorize("hasRole('USER')")
@GetMapping("/private")
public String getPrivate() {
return "public";
}
安全端点仅在登录后将具有正确角色的令牌放置在请求标头中才有效。但是,当我想访问没有令牌的公共端点时,我总是得到状态401,错误为Full authentication is required to access this resource
。
这是我的安全配置:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests().anyRequest().authenticated()
.and()
.csrf().disable();
}
}
和授权服务器配置:
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
private final UserDetailsService appUserDetailService;
private final AuthenticationManager authenticationManager;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
endpoints
.tokenStore(tokenStore())
.tokenEnhancer(tokenEnhancer())
.authenticationManager(authenticationManager)
.userDetailsService(appUserDetailService);
}
}
我也尝试将.authorizeRequests().anyRequest().authenticated()
更改为此:.authorizeRequests().anyRequest().permitAll()
,但没有更改。我最喜欢的方法是使用注释处理安全性。谢谢。
antMatchers()将解决问题。我们经常使用它。最好让不安全的端点处于不同的类中,并通过请求映射在类级别上控制安全性。
antMatchers("/public").permitAll()
链接到Spring Security API-https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/config/annotation/web/builders/HttpSecurity.html#antMatcher-java.lang.String-