2016-06-07 1 views
23

내 프로젝트에 Spring Security가 있습니다. 주요 문제 : http://localhost:8080/api/v2/api-docs에 swagger URL에 액세스 할 수 없습니다. 누락되었거나 잘못된 승인 헤더가 표시됩니다.인증없이 Swagger URL에 액세스 할 수 있도록 Spring Security를 ​​설정하는 방법

@Configuration 
@EnableSwagger2 
public class SwaggerConfig { 

@Bean 
public Docket api() { 
    return new Docket(DocumentationType.SWAGGER_2).select() 
      .apis(RequestHandlerSelectors.any()) 
      .paths(PathSelectors.any()) 
      .build() 
      .apiInfo(apiInfo()); 
} 

private ApiInfo apiInfo() { 
    ApiInfo apiInfo = new ApiInfo("My REST API", "Some custom description of API.", "API TOS", "Terms of service", "[email protected]", "License of API", "API license URL"); 
    return apiInfo; 
} 

appconfig가 :

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = { "com.musigma.esp2" }) 
@Import(SwaggerConfig.class) 
public class AppConfig extends WebMvcConfigurerAdapter { 

// ========= Overrides =========== 

@Override 
public void addInterceptors(InterceptorRegistry registry) { 
    registry.addInterceptor(new LocaleChangeInterceptor()); 
} 

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("swagger-ui.html") 
     .addResourceLocations("classpath:/META-INF/resources/"); 

    registry.addResourceHandler("/webjars/**") 
     .addResourceLocations("classpath:/META-INF/resources/webjars/"); 
} 

web.xml의 항목 :

Screenshot of the browser window 내 pom.xml 파일은 항목

<dependency> 
     <groupId>io.springfox</groupId> 
     <artifactId>springfox-swagger2</artifactId> 
     <version>2.4.0</version> 
    </dependency> 

    <dependency> 
     <groupId>io.springfox</groupId> 
     <artifactId>springfox-swagger-ui</artifactId> 
     <version>2.4.0</version> 
    </dependency> 

SwaggerConfig 다음이

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     com.musigma.esp2.configuration.AppConfig 
     com.musigma.esp2.configuration.WebSecurityConfiguration 
     com.musigma.esp2.configuration.PersistenceConfig 
     com.musigma.esp2.configuration.ACLConfig 
     com.musigma.esp2.configuration.SwaggerConfig 
    </param-value> 
</context-param> 

WebSecurityConfig : 트릭을 할해야 당신의 WebSecurityConfiguration 클래스에이 추가

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
@ComponentScan(basePackages = { "com.musigma.esp2.service", "com.musigma.esp2.security" }) 
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { 
@Override 
    protected void configure(HttpSecurity httpSecurity) throws Exception { 
     httpSecurity 
     .csrf() 
      .disable() 
     .exceptionHandling() 
      .authenticationEntryPoint(this.unauthorizedHandler) 
      .and() 
     .sessionManagement() 
      .sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
      .and() 
     .authorizeRequests() 
      .antMatchers("/auth/login", "/auth/logout").permitAll() 
      .antMatchers("/api/**").authenticated() 
      .anyRequest().authenticated(); 

     // custom JSON based authentication by POST of {"username":"<name>","password":"<password>"} which sets the token header upon authentication 
     httpSecurity.addFilterBefore(loginFilter(), UsernamePasswordAuthenticationFilter.class); 

     // custom Token based authentication based on the header previously given to the client 
     httpSecurity.addFilterBefore(new StatelessTokenAuthenticationFilter(tokenAuthenticationService), UsernamePasswordAuthenticationFilter.class); 
    } 
} 

답변

47

.

@Configuration 
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Override 
    public void configure(WebSecurity web) throws Exception { 
     web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security", "/swagger-ui.html", "/webjars/**"); 
    } 

} 
+5

는이 같은 뭔가가 필요 ,/configuration/security ","/swagger-ui.html ","/ webjars/** ","/ swagger-resources/configuration/ui ","/ swagger-ui.html ") permitAll() –

+2

내 경우에는이 규칙이 작동합니다. .antMatchers ("/ v2/api-docs", "/ configuration/ui", "/ swagger-resources", "/ configuration/security", "/swagger-ui.html" "/ swagger-resources/configuration/security"). allowAll() –

+0

@ nikolai.se "/ webjars/**", "/ swagger-resources/configuration/ui", "/ swagge r-ui.html" rdiuk "/ swagge r-ui.html"끝점을 두 번 추가하고 있습니다. 구체적인 이유는 무엇입니까? –

10

/configuration/** 및/swagger-resources/**로 업데이트되었으며 저에게 효과적이었습니다.

@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**", "/swagger-ui.html", "/webjars/**"); 

} 
0

스프링 부트 2.0.0.M7 + 스프링 보안 + 스프링스 2.8.0을 사용하여 동일한 문제가 발생했습니다. 그리고 Swagger UI 리소스에 대한 공개 액세스를 허용하는 다음 보안 구성을 사용하여이 문제를 해결했습니다. \t \t \t \t .antMatchers ("/ V2/API-문서", "/ 구성/UI", "/ 자신감-자원"당신은 자신감-UI를 사용하는 경우

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    private static final String[] AUTH_WHITELIST = { 
      // -- swagger ui 
      "/v2/api-docs", 
      "/swagger-resources", 
      "/swagger-resources/**", 
      "/configuration/ui", 
      "/configuration/security", 
      "/swagger-ui.html", 
      "/webjars/**" 
      // other public endpoints of your API may be appended to this array 
    }; 


    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http. 
       // ... here goes your custom security configuration 
       authorizeRequests(). 
       antMatchers(AUTH_WHITELIST).permitAll(). // whitelist Swagger UI resources 
       // ... here goes your custom security configuration 
       antMatchers("/**").authenticated(); // require authentication for any endpoint that's not whitelisted 
    } 

} 
+0

이 클래스를 추가 한 후 swagger-ui를 볼 수 있지만 API는 access_token에 액세스하지 못하고 액세스가 금지 된 오류가 발생했습니다. 아래,'{ "타임 스탬프": 1519798917075, "상태": 403, "오류": "금지", "메시지": "액세스가 거부되었습니다", "경로": "/ /가게" }' –

+0

@ChandrakantAudhutwar는'antMatchers ("/ **"). authenticated()'문을 삭제하거나 자신의 인증 구성으로 대체합니다. 조심해, 당신은 보안으로 무엇을하고 있는지 더 잘 알 것이다. – naXa

+0

네, 효과가있었습니다. 나는 swagger-ui를 우회하는 것을 생각하고 있었지만, 보안이 유지되는 다른 API들도 고려했습니다. 이제 내 API도 무시됩니다. –

0
@Override 
    protected void configure(HttpSecurity http) throws Exception { 
    http 
    .csrf().disable() 
    .authorizeRequests() 
     .antMatchers("/api/**").authenticated() 
     .anyRequest().permitAll() 
     .and() 
    .httpBasic().and() 
    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); 
} 
+1

이 코드 스 니펫을 이용해 주셔서 감사 드리며 이는 약간의 제한적인 단기간의 도움이 될 것입니다. 적절한 설명을 통해 (* meta.stackexchange.com/q/114762) 왜 * 이것이 문제의 좋은 해결책인지를 보여줌으로써 장기적인 가치를 향상시킬 수있을 것이며, 미래의 독자들에게 더 유용 할 것입니다. 다른 유사한 질문. 귀하의 가정을 포함하여 몇 가지 설명을 추가하려면 답을 편집하십시오. –