В моем контроллере у меня есть две конечные точки, одна из которых защищена, а другая опубликована c:
@GetMapping("/public")
public String getPublic() {
return "public";
}
@PreAuthorize("hasRole('USER')")
@GetMapping("/private")
public String getPrivate() {
return "public";
}
Защищенная конечная точка работает только тогда, когда я вошел в систему и токен с нужной ролью помещен в заголовок запроса. Но когда я хочу получить доступ к конечной точке publi c без токена, я всегда получаю статус 401 с ошибкой
Для доступа к этому ресурсу требуется полная аутентификация
Вот моя безопасность конфигурация:
@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()
без изменений. Мой предпочтительный способ - справиться с безопасностью с аннотациями. Спасибо.