2017-07-13 4 views
0

J'ai une API construite avec SpringBoot, Jersey2, et Keycloak. J'utilise l'adaptateur SpringBoot ainsi que le SpringAdapter. Tout va bien.Keycloak protected API essayant d'exposer swagger.json

Je trébuche maintenant sur cette page https://github.com/swagger-api/swagger-core/wiki/Swagger-Core-Jersey-2.X-Project-Setup-1.5

et a commencé à utiliser le package fanfaronnades-core pour générer un fichier swagger.json pour mon API. La dépendance swagger-jersey2 exposera le fichier swagger.json à un lien comme celui-ci: http://localhost:8080/swagger.json. Cependant, je ne peux pas accéder publiquement à cette URL car keycloak la bloque.

Dans ma classe SecurityConfig ci-dessous, je donne les résultats suivants:

public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter 
{ 
    //....other code above 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     super.configure(http); 
     http.csrf().disable().authorizeRequests().antMatchers("*").permitAll(); 
     http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); 
    } 
} 

Comment puis-je modifier la configuration pour permettre au swagger.json à accéder sans avoir besoin de passer un jeton porteur? (Je l'ai testé avec accès à un jeton porteur et cela a fonctionné, mais je en ai besoin accessible sans un jeton porteur)

Répondre

0

J'ai fini par résoudre ce en procédant comme suit:

  1. Créer une nouvelle annotation PubliResource.
  2. Créé une liste au démarrage des classes annotées avec PublicResource, puis explicitement laisser les demandes lancées sur ces classes même si aucun jeton n'a été détecté.
import java.lang.annotation.*; 

/*** 
* Used for marking a class accessible to a non-authorized user for 
* @GET, @PUT, @POST, and @DELETE annotations 
*/ 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@Inherited 
public @interface PublicResource { 

} 

Alors je fait un haricot AuthenticationTokenProcessingFilter. Puis, dans ma classe principale, je l'ai fait pour qu'il soit enregistré en tant que filtre.

@Configuration 
@EnableAutoConfiguration(exclude = {FallbackWebSecurityAutoConfiguration.class, SpringBootWebSecurityConfiguration.class, DataSourceAutoConfiguration.class}) 
@ComponentScan 
@EnableAsync 
public class MyApi { 

    //...other code plus the main method 

    @Bean 
    public AuthenticationTokenProcessingFilter authFilter() { 
     return new AuthenticationTokenProcessingFilter(); 
    } 
}