Невозможно получить доступ к незащищенным конечным точкам в Spring Boot - PullRequest
1 голос
/ 07 февраля 2020

В моем контроллере у меня есть две конечные точки, одна из которых защищена, а другая опубликована 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() без изменений. Мой предпочтительный способ - справиться с безопасностью с аннотациями. Спасибо.

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

У вас есть два варианта, можно go с любым из них.

Опция 1 : в вашей конечной точке измените следующим образом.

@PreAuthorize("permitAll()")  
@GetMapping("/public")
public String getPublic() {
    return "public";
}

И измените свой метод configure(HttpSecurity http), сделайте так.

@Override
public void configure(HttpSecurity http) throws Exception {
    http
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .authorizeRequests()
        .anyRequest().permitAll()
        .and()
        .csrf().disable();
}

Опция 2 : В вашем методе configure(HttpSecurity http) просто сделайте это .

@Override
public void configure(HttpSecurity http) throws Exception {
    http
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .authorizeRequests()
        .antMatchers("/public").permitAll()  
        .anyRequest().authenticated()
        .and()
        .csrf().disable();
}
0 голосов
/ 07 февраля 2020

antMatchers () добьются цели. Мы используем это много. Также лучше иметь незащищенные конечные точки в другом классе и контролировать безопасность на уровне класса с помощью сопоставления запросов.

antMatchers("/public").permitAll()

Ссылка на API безопасности Spring - https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/config/annotation/web/builders/HttpSecurity.html#antMatcher - java .lang.String -

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...