Rozwijam usługę demo REST, używając Spring Boot
, gdzie użytkownik musi się zalogować, aby wykonać określony podzbiór operacji. Po dodaniu Swagger UI
(używając springfox
biblioteki) z tej prostej konfiguracji:Dokumentowanie interfejsu API logowania/wylogowania wiosennego w aplikacji Swagger
@Bean
public Docket docApi() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(any())
.paths(PathSelectors.ant("/api/**"))
.build()
.pathMapping("/")
.apiInfo(apiInfo())
.directModelSubstitute(LocalDate.class, String.class)
.useDefaultResponseMessages(true)
.enableUrlTemplating(true);
}
skończę ze wszystkimi API z wszystkich operacji wymienionych na Swagger UI
stronie. Niestety nie mam wśród nich punktów końcowych logowania/wylogowania.
Problem polega na tym, że część tych operacji nie może zostać wykonana za pomocą wbudowanej postaci Swagger UI
(uważam, że jest to naprawdę fajna funkcja i chciałaby, aby działała), ponieważ użytkownik nie jest zalogowany. Czy istnieje rozwiązanie tego problemu ? Czy mogę ręcznie zdefiniować niektóre punkty końcowe w Swagger
?
Jeśli nie było formą do składania poświadczeń (czyli punktów końcowych logowanie/wylogowanie) Mógłbym wykonać upoważnienie, które przed użyciem zabezpieczonych punktów końcowych. Następnie użytkownik może wyodrębnić z odpowiedzi odpowiedź token/sessionid
i wkleić ją do niestandardowego parametru zapytania zdefiniowanego przez @ApiImplicitParams
.
Poniżej znajdziesz moją konfigurację zabezpieczeń:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginProcessingUrl("/api/login")
.usernameParameter("username")
.passwordParameter("password")
.successHandler(new CustomAuthenticationSuccessHandler())
.failureHandler(new CustomAuthenticationFailureHandler())
.permitAll()
.and()
.logout()
.logoutUrl("/api/logout")
.logoutSuccessHandler(new CustomLogoutSuccessHandler())
.deleteCookies("JSESSIONID")
.permitAll()
.and()
.csrf()
.disable()
.exceptionHandling()
.authenticationEntryPoint(new CustomAuthenticationEntryPoint())
.and()
.authorizeRequests()
.and()
.headers()
.frameOptions()
.disable();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder());
}