我有一个用keycloak和oauth2保护的spring boot后端。前端是一个有角度的应用程序。密钥斗篷中有两个客户端,一个用于前端身份验证的访问类型为“ public”,一个用于后端应用程序的访问类型为“ bearer-only”。
角形件和弹簧之间的界面设计得很宽阔。
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”,并导致密钥斗篷记录警告消息,但并没有进一步说明我。
为了获得对后端的访问权限,我该怎么做才能针对密钥库进行身份验证?