Swagger Spring对Keycloak的身份验证

时间:2018-10-17 13:04:58

标签: oauth-2.0 swagger spring-security-oauth2 swagger-ui keycloak

我有一个用keycloak和oauth2保护的spring boot后端。前端是一个有角度的应用程序。密钥斗篷中有两个客户端,一个用于前端身份验证的访问类型为“ public”,一个用于后端应用程序的访问类型为“ bearer-only”。

角形件和弹簧之间的界面设计得很宽阔。

使得Swagger UI仍然可见
HttpSecurity.authorizeRequests().antMatchers(new String[]{"/swagger-ui.html", "/swagger/swagger.yaml", "/swagger-resources", "/swagger-resources/**", "/webjars/springfox-swagger-ui/**"}).permitAll()

当我呼叫休息服务时,由于后端是安全的,因此会出现401错误。因此,我想为Swagger UI中的调用获取访问令牌。 到目前为止,从此发布Keycloak integration in Swagger中添加Java代码和昂首阔步的yaml配置无法正常工作。

我在keycloak中为swagger-ui创建了具有“公共”访问类型的第三个客户端。

swagger.yaml

...
securityDefinitions:
  OAuth2:
    type: oauth2
    flow: implicit
    authorizationUrl: http://localhost:8080/auth/
    scopes:
      openid: openid
      profile: profile
security:
  - OAuth2: [openid, profile]

Swagger-Config :(注意:Swagger从提供的yaml文件而不是从控制器类构建ui)

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

private static final Logger LOGGER = LoggerFactory.getLogger(SwaggerConfiguration.class);

@Bean
WebMvcConfigurer configurer() {
    return new WebMvcConfigurer() {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry
                    .addResourceHandler("/swagger/**")
                    .addResourceLocations("classpath:swagger/");

        }
    };
}

@Primary
@Bean
public SwaggerResourcesProvider swaggerResourcesProvider() {
    return () -> {
        SwaggerResource resource = new SwaggerResource();
        resource.setName("QM-API");
        resource.setLocation("/swagger/swagger.yaml");

        SwaggerResource models = new SwaggerResource();
        models.setName("QM-Models");
        models.setLocation("/swagger/qm-common-definitions.yaml");

        List<SwaggerResource> resources = new ArrayList<>();
        resources.add(resource);
        resources.add(models);
        return resources;
    };
}

@Bean
public SecurityConfiguration securityConfiguration() {

    Map<String, Object> additionalQueryStringParams=new HashMap<>();
    additionalQueryStringParams.put("nonce","123456");

    return SecurityConfigurationBuilder.builder()
            .clientId("test-uid").realm("Master").appName("swagger-ui")
            .additionalQueryStringParams(additionalQueryStringParams)
            .build();
}

private List<SecurityContext> buildSecurityContext() {
    List<SecurityReference> securityReferences = new ArrayList<>();

    securityReferences.add(SecurityReference.builder().reference("oauth2").scopes(scopes().toArray(new AuthorizationScope[]{})).build());

    SecurityContext context = SecurityContext.builder().forPaths(Predicates.alwaysTrue()).securityReferences(securityReferences).build();

    List<SecurityContext> ret = new ArrayList<>();
    ret.add(context);
    return ret;
}

private List<? extends SecurityScheme> buildSecurityScheme() {
    List<SecurityScheme> lst = new ArrayList<>();
    lst.add(new ApiKey("api_key", "X-API-KEY", "header"));

    LoginEndpoint login = new LoginEndpointBuilder().url("http://localhost:8080/auth/realms/master/protocol/openid-connect/auth").build();

    List<GrantType> gTypes = new ArrayList<>();
    gTypes.add(new ImplicitGrant(login, "acces_token"));

    lst.add(new OAuth("oauth2", scopes(), gTypes));
    return lst;
}

private List<AuthorizationScope> scopes() {
    List<AuthorizationScope> scopes = new ArrayList<>();
    for (String scopeItem : new String[]{"openid=openid", "profile=profile"}) {
        String scope[] = scopeItem.split("=");
        if (scope.length == 2) {
            scopes.add(new AuthorizationScopeBuilder().scope(scope[0]).description(scope[1]).build());
        } else {
            LOGGER.warn("Scope '{}' is not valid (format is scope=description)", scopeItem);
        }
    }

    return scopes;
}
}

通过这种配置,我的swagger-ui中有一个“授权”按钮。按下此按钮将打开模式表格,使我有机会输入client_id,并显示 范围的复选框。在此表单中按“授权”按钮会在我的浏览器中打开一个新选项卡,其中显示了密钥斗篷欢迎页面。 Keycloak不显示任何日志错误消息。

我对swagger.yaml中的“流”进行了一些实验。将其更改为“ password”会导致模式形式提供更多输入,例如“ user”和“ password”,并导致密钥斗篷记录警告消息,但并没有进一步说明我。

为了获得对后端的访问权限,我该怎么做才能针对密钥库进行身份验证?

0 个答案:

没有答案