6

Prawdopodobnie robię coś złego tutaj, po prostu nie mogę wymyślić, co ...Jak ponownie włączyć anonimowy dostęp do punktu końcowego Spring Boot Health?

Mam serwer uwierzytelniania Oauth2 i serwer zasobów w tej samej aplikacji. Konfiguracja serwera

zasobów: konfiguracja serwera

@Configuration 
@EnableResourceServer 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER-1) 
public class ResourceServerConfig extends ResourceServerConfigurerAdapter { 
    public static final String RESOURCE_ID = "resources"; 

    @Override 
    public void configure(final ResourceServerSecurityConfigurer resources) { 
     resources 
       .resourceId(RESOURCE_ID); 
    } 

    @Override 
    public void configure(final HttpSecurity http) throws Exception { 
     http 
       .authorizeRequests() 
       .antMatchers(HttpMethod.GET, "/**").access("#oauth2.hasScope('read')") 
       .antMatchers(HttpMethod.POST, "/**").access("#oauth2.hasScope('write')") 
       .antMatchers(HttpMethod.PUT, "/**").access("#oauth2.hasScope('write')") 
       .antMatchers(HttpMethod.PATCH, "/**").access("#oauth2.hasScope('write')") 
       .antMatchers(HttpMethod.DELETE, "/**").access("#oauth2.hasScope('write')") 
       .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() 
       .antMatchers(HttpMethod.GET, "/health").permitAll(); 
    } 

} 

Uwierzytelnianie:

@Configuration 
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private UserDetailsService userDetailsService; 

    @Override 
    public void configure(final AuthenticationManagerBuilder auth) throws Exception { 
     auth 
       .userDetailsService(userDetailsService) 
       .passwordEncoder(new BCryptPasswordEncoder()); 
    } 

    @Override 
    protected void configure(final HttpSecurity http) throws Exception { 
     http 
       .authorizeRequests() 
       .anyRequest().authenticated() 
       .and().httpBasic().realmName("OAuth Server"); 
    } 
} 

Przy próbie dostępu/zdrowie, mam HTTP/1.1 401 nieupoważnione.

Jak mogę przekonać Spring Boot, aby/health był anonimowo dostępny?

+0

W SecurityConfig Myślę, że brakuje ci dodania, że: .antMatchers (HttpMethod.GET, "/ health"). PermitAll(); – mherbert

+1

Kolejność, w jakiej określasz swoje mapowania, jest również kolejnością, w jakiej są konsultowane. Pierwszy mecz wygrywa ... Ponieważ '/ **' pasuje do wszystkiego, twoje mapowanie '/ health' jest bezużyteczne. Przenieś to nad mapowania '/ **', aby było funkcjonalne. –

+0

@ M.Deinum Dzięki, że rozwiązałeś problem. Jeśli dodasz to jako odpowiedź, jestem szczęśliwy, że mogę to zaakceptować. – endrec

Odpowiedz

1

Jako M. Deinum powiedział:

Kolejność, w którym podasz swoje mapowania jest również kolejność które są konsultowane. Pierwszy mecz wygrywa ... As/** dopasowuje wszystko, czego potrzebujesz, aby twoje mapowanie zdrowia było bezużyteczne. Przenieś to nad odwzorowania/** , aby było funkcjonalne. - M. Deinum 20 sierpnia o 17:56