Почему Spring Security allowAll () не работает с OAuth2.0? - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть REST API, защищенный с помощью OAuth2.0. Я могу получить токен доступа, используя http://localhost:8085/auth/token?grant_type=password&username=22@gmail.com&password=mypass(along с именем пользователя, пропустите базовую аутентификацию).
Но когда я пытаюсь получить доступ http://localhost:8085/api/v1/signup, API возвращает ошибку 401 unauthorized.
Несмотря на то, что я использовал antMatchers("/signup").permitAll(), почему API ожидает access-token для доступа к этому ресурсу?Передача access-token вместе с этим запросом зарегистрирует пользователя.
Это моя конфигурация сервера ресурсов

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

//require beans and methods here

@Autowired
public void configureGlobal(final AuthenticationManagerBuilder auth) {
    auth.authenticationProvider(authProvider());
}

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

Обновление : в соответствии с предложением этого потока Я проигнорировал /signup в ``, но это также не сработало.

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
@ComponentScan(basePackages = { "com.sample.rest.security" })
@Order(2)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    //other Beans & methods

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        List<RequestMatcher> requestMatchers = new ArrayList<RequestMatcher>();
        requestMatchers.add(new AntPathRequestMatcher("/signup/**"));

        http.
        requestMatcher(new OrRequestMatcher(requestMatchers)).
        authorizeRequests().antMatchers("/signup/**")
        .permitAll();
    }

}

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Я получил вопрос.Это был контекстный путь, который вызывал проблему.У меня есть сервлет диспетчера, определенный с URL-адресом сопоставления /api/v1/*, и, как видно из моего запроса signup, он содержит путь контекста, например http://localhost:8085/api/v1/signup

Для конфигурации OAuth2 в Spring нам нужно принятьдополнительная забота о пути контекста.Во-первых, он должен быть определен в AuthorizationServer

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
  @Override
  public void configure(final AuthorizationServerEndpointsConfigurer endpoints) { 
        endpoints
        .prefix("/api/v1") //here
        .tokenStore(tokenStore())
        .accessTokenConverter(accessTokenConverter())
        .authenticationManager(authenticationManager)
        .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST);
  }

Затем контекст должен быть добавлен к пути permitAll() следующим образом

@Override
public void configure(final HttpSecurity http) throws Exception {
    http
    .authorizeRequests()
    .antMatchers("/api/v1/signup").permitAll()  //context path here
    .anyRequest().authenticated();
}

До настоящего времени запрос регистрациивсе еще ожидал передать токен доступа с этим.Чтобы удалить защиту OAuth из регистрации, нам нужно удалить защиту на WebSecurity, что можно сделать с помощью WebSecurityConfigurerAdapter

@EnableWebSecurity
@EnableGlobalMethodSecurity
@ComponentScan(basePackages = { "com.sample.rest.security" })
public class SecurityConfig extends WebSecurityConfigurerAdapter {

     @Override
     public void configure(WebSecurity webSecurity) throws Exception {
        webSecurity.ignoring().antMatchers("/signup");
     }
 //////////// OR use below method ///////////
/*  @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.
        authorizeRequests().antMatchers("/signup/**").permitAll();
    }
*/
}

Обратите внимание, что нет никакого смысла добавлять контекстный путь к WebSecurityConfigurerAdapter конфигурация.

0 голосов
/ 24 ноября 2018

Я думаю, что заказ является проблемой и соответствует **.

@Override
public void configure(final HttpSecurity http) throws Exception {

 http    
   .authorizeRequests()
     .antMatchers("/signup**")
     .permitAll()
     .and()
   .authorizeRequests()
     .anyRequest()
     .authenticated()
     .and()
   .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() .csrf().disable();  

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