Jak ustawić możliwość logowania i wylogowania w Swagerze w połączeniu ze Spring Security? Po włączeniu apki mogę kliknąć na zabezpieczony endpoint i jestem pytany o dane do logowania. Po zalogowaniu bez problemu dostaje się do danego zasobu, ale nie mam opcji wylogowania się i zalogowania na jakiegoś innego użytkownika. Mogę tylko wejść na localhost:8080/logout i co prawda dostaję komunikat o prawidłowym wylogowaniu, ale potem jak wejdę znowu na localhost:8080/swagger-ui to jestem dalej na starym użytkowniku. Na różnych tutorialach widziałem, że w Swagerze pojawa się informacja, że wszystkie endpoint są zabezpieczone i obok każdego jest taka kłódka i oczywiście możliwość logowania/wylogowywania.
Tutaj przykład:
https://i.stack.imgur.com/zRSoo.png
Moja konfiguracja Spring Security i Swaggera:
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
class SecurityConfig extends WebSecurityConfigurerAdapter {
private static final String[] permitAllEndpoints = {
"/api/registration",
"/h2/console/**",
"/v2/api-docs",
"/v3/api-docs/**",
"/swagger-resources/**",
"/swagger-ui/**"
};
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.httpBasic()
.and()
.formLogin()
.permitAll()
.and()
.logout()
.permitAll()
.and()
.authorizeRequests()
.mvcMatchers(permitAllEndpoints)
.permitAll()
.mvcMatchers("api/admin/**")
.hasAnyAuthority("ADMIN")
.anyRequest()
.authenticated()
.and()
.csrf()
.disable()
.headers()
.frameOptions()
.disable();
}
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@Configuration
class SwaggerConfig {
@Bean
Docket api() {
return new Docket(DocumentationType.OAS_30)
.select()
.paths(PathSelectors.ant("/api/**"))
.build();
}
}