Anonymous
Включение Swagger Springdoc-Openapi-UI (OpenAPI 3.0) с Spring Security-не может получить доступ к Swagger-UI.HTML (401)
Сообщение
Anonymous » 11 июн 2025, 12:04
Swagger OpenApi 3.0 работает с SpringDoc-Openapi-UI и пользовательским Beanpi Bean.
Код: Выделить всё
org.springframework.cloud
spring-cloud-starter-parent
Hoxton.SR10
...
org.springdoc
springdoc-openapi-ui
1.5.5
SwaggerConfig:
Проблема с Spring-Security с той же конфигурацией
мы. Springdoc-Openapi-UI, Springdoc-Openapi-Security вместе с Spring-Boot-Starter-Security и KeyCloak-spring-boot-starter. < /p>
pom.xml
Код: Выделить всё
org.springdoc
springdoc-openapi-security
1.5.5
org.keycloak
keycloak-spring-boot-starter
12.0.2
org.springframework.boot
spring-boot-starter-security
2.4.2
< /code>
DummySecurityConfig (в данный момент используется профиль dev): < /p>
@Profile({"test", "dev"})
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(
prePostEnabled = true,
securedEnabled = true,
jsr250Enabled = true)
@EnableWebMvc
public class DummySecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {
protected static final String[] ACTUATOR_WHITELIST = {
"/actuator/**"
};
protected static final String[] SWAGGER_WHITELIST = {
"/v3/api-docs/**",
"/swagger-ui/**",
"/swagger-ui.html",
};
@Value("${client.cors.allowed-origins:*}")
private String[] allowedOrigins;
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html").permitAll()
.anyRequest().authenticated()
.and()
.httpBasic(); //or anything else, e.g. .oauth2ResourceServer().jwt()
}
@Override
protected void configure(AuthenticationManagerBuilder auth) {
auth.authenticationProvider(authenticationProvider());
}
@Override
public void configure(WebSecurity web) {
web.ignoring()
.antMatchers(SWAGGER_WHITELIST)
.antMatchers(ACTUATOR_WHITELIST);
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins(allowedOrigins);
}
@Bean
public AuthenticationProvider authenticationProvider() {
AuthenticationProvider authenticationProvider = new AuthenticationProvider() {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
SimpleGrantedAuthority authority = new SimpleGrantedAuthority("ROLE_" + authentication.getPrincipal().toString().toUpperCase());
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
authentication.getPrincipal(), authentication.getCredentials(), Collections.singleton(authority));
token.setDetails(authentication);
return token;
}
@Override
public boolean supports(Class aClass) {
return true;
}
};
return authenticationProvider;
}
}
< /code>
SecurityConfig (не используется в примерах, но также будет использоваться в будущем): < /p>
@Profile({"staging", "devstaging"})
@KeycloakConfiguration
@EnableGlobalMethodSecurity(
prePostEnabled = true,
securedEnabled = true,
jsr250Enabled = true)
@EnableWebMvc
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter implements WebMvcConfigurer {
protected static final String[] ACTUATOR_WHITELIST = {
"/actuator/**"
};
protected static final String[] SWAGGER_WHITELIST = {
"/v3/api-docs/**",
"/swagger-ui/**",
"/swagger-ui.html",
};
@Value("${client.cors.allowed-origins:*}")
private String[] allowedOrigins;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
SimpleAuthorityMapper grantedAuthorityMapper = new SimpleAuthorityMapper();
grantedAuthorityMapper.setConvertToUpperCase(true);
grantedAuthorityMapper.setPrefix("ROLE_");
KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(grantedAuthorityMapper);
auth.authenticationProvider(keycloakAuthenticationProvider);
}
@Bean
public KeycloakSpringBootConfigResolver keycloakConfigResolver() {
return new KeycloakSpringBootConfigResolver();
}
@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}
@Override
public void configure(WebSecurity web) {
web.ignoring()
.antMatchers(SWAGGER_WHITELIST)
.antMatchers(ACTUATOR_WHITELIST);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http
.csrf().disable()
.cors().and()
.authorizeRequests().anyRequest().authenticated();
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins(allowedOrigins);
}
}
< /code>
application-dev.yml:
server:
port: 8083
servlet:
context-path: /planning
keycloak:
enabled: false
springdoc:
show-actuator: true
< /code>
Мы уже пытались использовать следующие ссылки для решения проблемы: < /p>
[list]
[*] Поддержка безопасности пружины < /li>
Разрешить анонимный доступ к Springdoc-Openapi-ui с Spring Security < /li>
ui Redireing to to to to to /swagger-ui/index.html?configurl=/v3/api-docs/swagger-config
[*]f.a.q
[/list]
Примеры открытия Swagger-ui urls (профиль dev): />http://localhost:8083/planning/swagger-ui.html (не работает):
Подробнее здесь: [url]https://stackoverflow.com/questions/66489351/enabling-swagger-springdoc-openapi-ui-openapi-3-0-with-spring-security-canno[/url]
1749632695
Anonymous
Swagger OpenApi 3.0 работает с SpringDoc-Openapi-UI и пользовательским Beanpi Bean.[code] org.springframework.cloud spring-cloud-starter-parent Hoxton.SR10 ... org.springdoc springdoc-openapi-ui 1.5.5 [/code] SwaggerConfig: Проблема с Spring-Security с той же конфигурацией мы. Springdoc-Openapi-UI, Springdoc-Openapi-Security вместе с Spring-Boot-Starter-Security и KeyCloak-spring-boot-starter. < /p> pom.xml [code] org.springdoc springdoc-openapi-security 1.5.5 org.keycloak keycloak-spring-boot-starter 12.0.2 org.springframework.boot spring-boot-starter-security 2.4.2 < /code> DummySecurityConfig (в данный момент используется профиль dev): < /p> @Profile({"test", "dev"}) @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity( prePostEnabled = true, securedEnabled = true, jsr250Enabled = true) @EnableWebMvc public class DummySecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer { protected static final String[] ACTUATOR_WHITELIST = { "/actuator/**" }; protected static final String[] SWAGGER_WHITELIST = { "/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html", }; @Value("${client.cors.allowed-origins:*}") private String[] allowedOrigins; @Override public void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html").permitAll() .anyRequest().authenticated() .and() .httpBasic(); //or anything else, e.g. .oauth2ResourceServer().jwt() } @Override protected void configure(AuthenticationManagerBuilder auth) { auth.authenticationProvider(authenticationProvider()); } @Override public void configure(WebSecurity web) { web.ignoring() .antMatchers(SWAGGER_WHITELIST) .antMatchers(ACTUATOR_WHITELIST); } @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins(allowedOrigins); } @Bean public AuthenticationProvider authenticationProvider() { AuthenticationProvider authenticationProvider = new AuthenticationProvider() { @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { SimpleGrantedAuthority authority = new SimpleGrantedAuthority("ROLE_" + authentication.getPrincipal().toString().toUpperCase()); UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( authentication.getPrincipal(), authentication.getCredentials(), Collections.singleton(authority)); token.setDetails(authentication); return token; } @Override public boolean supports(Class aClass) { return true; } }; return authenticationProvider; } } < /code> SecurityConfig (не используется в примерах, но также будет использоваться в будущем): < /p> @Profile({"staging", "devstaging"}) @KeycloakConfiguration @EnableGlobalMethodSecurity( prePostEnabled = true, securedEnabled = true, jsr250Enabled = true) @EnableWebMvc public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter implements WebMvcConfigurer { protected static final String[] ACTUATOR_WHITELIST = { "/actuator/**" }; protected static final String[] SWAGGER_WHITELIST = { "/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html", }; @Value("${client.cors.allowed-origins:*}") private String[] allowedOrigins; @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) { SimpleAuthorityMapper grantedAuthorityMapper = new SimpleAuthorityMapper(); grantedAuthorityMapper.setConvertToUpperCase(true); grantedAuthorityMapper.setPrefix("ROLE_"); KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider(); keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(grantedAuthorityMapper); auth.authenticationProvider(keycloakAuthenticationProvider); } @Bean public KeycloakSpringBootConfigResolver keycloakConfigResolver() { return new KeycloakSpringBootConfigResolver(); } @Bean @Override protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl()); } @Override public void configure(WebSecurity web) { web.ignoring() .antMatchers(SWAGGER_WHITELIST) .antMatchers(ACTUATOR_WHITELIST); } @Override protected void configure(HttpSecurity http) throws Exception { super.configure(http); http .csrf().disable() .cors().and() .authorizeRequests().anyRequest().authenticated(); } @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins(allowedOrigins); } } < /code> application-dev.yml: server: port: 8083 servlet: context-path: /planning keycloak: enabled: false springdoc: show-actuator: true < /code> Мы уже пытались использовать следующие ссылки для решения проблемы: < /p> [list] [*] Поддержка безопасности пружины < /li> Разрешить анонимный доступ к Springdoc-Openapi-ui с Spring Security < /li> ui Redireing to to to to to /swagger-ui/index.html?configurl=/v3/api-docs/swagger-config [*]f.a.q [/list] Примеры открытия Swagger-ui urls (профиль dev): />http://localhost:8083/planning/swagger-ui.html (не работает): Подробнее здесь: [url]https://stackoverflow.com/questions/66489351/enabling-swagger-springdoc-openapi-ui-openapi-3-0-with-spring-security-canno[/url]