on
spring boot swagger setting
spring boot swagger setting
728x90
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Value ( "${project.properties.swagger-host}" )
private String swaggerHost ;
@Autowired
ServerProperties serverProperties ;
@Autowired
private TypeResolver typeResolver ;
@Bean
public Docket api (TypeResolver typeResolver) {
ResolvedRecursiveType resolvedRecursiveType = new ResolvedRecursiveType(Integer. class, null ) ;
Optional typeInt = Optional. of (resolvedRecursiveType) ;
resolvedRecursiveType = new ResolvedRecursiveType(String. class, null ) ;
Optional typeString = Optional. of (resolvedRecursiveType) ;
AllowableListValues osTypeAllowableList = new AllowableListValues(Stream. of (OsType. values ()).map(it -> it.name()).collect(Collectors. toList ()) , "string" ) ;
Parameter cponId = new Parameter( "X-cponId" , " 폰 아이디 " , "test-cponId" , false, false, new ModelRef( "string" ) , typeString , null, "header" , null, false, new ArrayList<>()) ;
Parameter serialNo = new Parameter( "X-serialNo" , " 디바이스 고유 번호 " , "test-serialNo" , false, false, new ModelRef( "string" ) , typeString , null, "header" , null, false, new ArrayList<>()) ;
Parameter cponModel = new Parameter( "X-cponModel" , " 폰 모델명 " , "test-cponModel" , false, false, new ModelRef( "string" ) , typeString , null, "header" , null, false, new ArrayList<>()) ;
Parameter osTypeCd = new Parameter( "X-osTypeCd" , " 폰 OS 타입 " , "OST001" , false, false, new ModelRef( "string" ) , typeString , osTypeAllowableList , "header" , null, false, new ArrayList<>()) ;
Parameter osVersion = new Parameter( "X-osVer" , " 폰 OS 버전 " , "test-cponModel" , false, false, new ModelRef( "string" ) , typeString , null, "header" , null, false, new ArrayList<>()) ;
Parameter pkgNm = new Parameter( "X-pkgNm" , " 어플 패키지명 " , "test-pkgNm" , false, false, new ModelRef( "string" ) , typeString , null, "header" , null, false, new ArrayList<>()) ;
Parameter pkgVersion = new Parameter( "X-pkgVer" , " 어플 VERSION" , "test-pkgVer" , false, false, new ModelRef( "string" ) , typeString , null, "header" , null, false, new ArrayList<>()) ;
Parameter userSeq = new Parameter( "X-userSeq" , " 서버 회원 고유 아이디 " , "1" , false, false, new ModelRef( "int" ) , typeInt , null, "header" , null, false, new ArrayList<>()) ;
return new Docket(DocumentationType. SWAGGER_2 )
.host( swaggerHost )
.apiInfo(apiInfo())
.ignoredParameterTypes(MedicineHeader. class )
.select()
.apis(RequestHandlerSelectors. basePackage ( "com.test.t.controller.api" ))
.paths(PathSelectors. any ())
.build()
.additionalModels(typeResolver.resolve(Msg. class, Error. class ))
.globalOperationParameters(Arrays. asList (cponId , serialNo , cponModel , osTypeCd , osVersion , pkgNm , pkgVersion , userSeq))
.globalResponseMessage(RequestMethod. GET , getCustomizedResponseMessages())
.globalResponseMessage(RequestMethod. POST , getCustomizedResponseMessages())
.globalResponseMessage(RequestMethod. DELETE , getCustomizedResponseMessages())
.globalResponseMessage(RequestMethod. PUT , getCustomizedResponseMessages())
.useDefaultResponseMessages( false ) ;
}
private ApiInfo apiInfo () {
return new ApiInfoBuilder()
.title( "medicine Brain" )
.description( "medicine documents" )
.build() ;
}
private List getCustomizedResponseMessages (){
ModelRef modelRef = new ModelRef(Error. class .getSimpleName()) ;
List responseMessages = new ArrayList<>() ;
responseMessages.add( new ResponseMessageBuilder().code( 500 ).message( "Server has crashed!! and Error" ).responseModel(modelRef).build()) ;
return responseMessages ;
}
}
@Configuration
@Import ({CommonWebMvcConfigurerAdapter. class })
@EnableWebMvc
@EnableConfigurationProperties (ProjectProperties. class )
@EnableScheduling
@EnableTransactionManagement
public class WebMvcConfigurerAdapter extends org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter {
@Value ( "${project.properties.angular-path}" )
private String angularPath ;
@Override
public void addViewControllers (ViewControllerRegistry registry) {
registry.addRedirectViewController( "/swagger/v2/api-docs" , "/v2/api-docs" ).setKeepQueryParams( true ) ;
registry.addRedirectViewController( "/swagger/swagger-resources/configuration/ui" , "/swagger-resources/configuration/ui" ) ;
registry.addRedirectViewController( "/swagger/swagger-resources/configuration/security" , "/swagger-resources/configuration/security" ) ;
registry.addRedirectViewController( "/swagger/swagger-resources" , "/swagger-resources" ) ;
}
// 리소스 패스 설정
@Override
public void addResourceHandlers (ResourceHandlerRegistry registry) {
registry.addResourceHandler( "/resources/**" ) .addResourceLocations( "/WEB-INF/resources/" ) ;
registry.addResourceHandler( "/webjars/**" ) .addResourceLocations( "classpath:/META-INF/resources/webjars/" ) ;
registry.addResourceHandler( "/swagger/**" ) .addResourceLocations( "classpath:/META-INF/resources/" ) ;
registry.addResourceHandler( "/assets/**" ) .addResourceLocations( angularPath + "/assets/" ) ;
registry.addResourceHandler( "/favicon.ico" ) .addResourceLocations( angularPath + "/assets/img/favicon/favicon.ico" ) ;
registry.addResourceHandler( "/*.html" ) .addResourceLocations( angularPath + "/" ) ;
registry.addResourceHandler( "/*.map" ) .addResourceLocations( angularPath + "/" ) ;
registry.addResourceHandler( "/*.js" ) .addResourceLocations( angularPath + "/" ) ;
}
}
@Slf4j
@Configuration
@EnableGlobalMethodSecurity ( prePostEnabled = true, securedEnabled = true )
@Order (SecurityProperties. ACCESS_OVERRIDE_ORDER )
@EnableWebSecurity
public class WebSecurityConfigurerAdapter extends org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter {
@Override
public void configure (WebSecurity web) throws Exception {
web.ignoring().antMatchers(
"/resources/**" ,
"/webjars/**" ,
"/assets/**" ,
"/*.js" ,
"/*.map" ,
"/favicon.ico" ,
API_PATH + "/**"
) ;
}
@Override
protected void configure (HttpSecurity http) throws Exception {
List> accessDecisionVoters = new ArrayList<>() ;
RoleVoter roleVoter = new RoleVoter() ;
accessDecisionVoters.add(roleVoter) ;
AffirmativeBased affirmativeBased = new AffirmativeBased(accessDecisionVoters) ;
affirmativeBased.setAllowIfAllAbstainDecisions( false ) ;
FilterSecurityInterceptor filterSecurityInterceptor = new FilterSecurityInterceptor() ;
filterSecurityInterceptor.setAuthenticationManager(authenticationManagerBean()) ;
filterSecurityInterceptor.setAccessDecisionManager(affirmativeBased) ;
filterSecurityInterceptor.setSecurityMetadataSource( new FilterInvocationSecurityMetadataSource ()) ;
http
.anonymous()
.and()
.csrf()
.ignoringAntMatchers( LOGOUT_URL )
.csrfTokenRepository(csrfTokenRepository())
.and()
.authorizeRequests()
.anyRequest().hasAnyAuthority()
.and()
.addFilterAfter( new CsrfHeaderFilter() , CsrfFilter. class )
.formLogin()
.loginPage( LOGIN_PAGE ) // 로그인 페이지
.loginProcessingUrl( LOGIN_PROCESSING_URL ) //login-processing-url 로그인 페이지 form action 에 입력할 주소 지정
.usernameParameter( USERNAME_PARAMETER )
.passwordParameter( USERPWD_PARAMETER )
.defaultSuccessUrl( DEFAULT_SUCCESS_URL ) // 성공시 이동될 페이지
.failureHandler(authenticationFailureHandler())
.successHandler( new AuthenticationSuccessHandler())
.permitAll()
.and()
.logout()
.deleteCookies( REMEMBER_ME_COOKE_NAME )
.deleteCookies( "JSESSIONID" )
.deleteCookies(CsrfHeaderFilter. CSRF_TOKEN_COOKE_NAME )
.logoutUrl( LOGOUT_URL )
.invalidateHttpSession( true )
.logoutSuccessHandler(logoutSuccessHandler()) // 커스텀으로 로그아웃된거에 대한 처리를 해주면 로그아웃성공 URL 로 가지 않으니 커스텀할떄 사용해여라
.permitAll()
.and()
.addFilter(filterSecurityInterceptor) ;
}
}
@Slf4j
public class FilterInvocationSecurityMetadataSource implements org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource {
@Override
public Collection getAttributes (Object object){
FilterInvocation fi = (FilterInvocation) object ;
HttpServletRequest request = fi.getHttpRequest() ;
String uri = request.getRequestURI() ;
String method = request.getMethod() ;
SecurityContext context = SecurityContextHolder. getContext () ;
Authentication authentication = context.getAuthentication() ;
log .debug( "url:{}, method:{}, Authentication:{} FilterInvocationSecurityMetadataSource >> {}" , uri , method , authentication , object.toString()) ;
List attributes = new ArrayList<>() ;
if (uri.startsWith( "/swagger" ) || uri.startsWith( "/v2/api-docs" )){
attributes.add( new com.omnicns.web.spring.security.ConfigAttribute( "ROLE_AUTH" )) ;
}
//...
return attributes ;
}
@Override
public Collection getAllConfigAttributes () {
return Collections. emptyList () ;
}
@Override
public boolean supports (Class clazz) {
return FilterInvocation. class .isAssignableFrom(clazz) ;
}
}
@Getter
@Setter
@EqualsAndHashCode ( callSuper = false )
@Entity
@Table ( name = "T_ADMIN" )
@Slf4j
@NamedEntityGraph ( name = "UserDetails.auths" , attributeNodes = @NamedAttributeNode ( "auths" ))
public class UserDetails extends AdmBase implements Serializable , org.springframework.security.core.userdetails.UserDetails {
@OneToMany
@JoinColumn ( name = "ADM_SEQ" , referencedColumnName = "ADM_SEQ" , insertable = false, updatable = false )
@OrderBy ( value = "menuLvl, menuOrd, prntUrlSeq asc" )
List auths ;
@Override
public Collection>> getAuthorities () {
Map>> contain = new HashMap<>() ;
for (Auth auth : ListUtils. emptyIfNull ( auths )) {
GrantedObjAuthority> selectedAuths = Optional. ofNullable (contain.get(auth.getAuthId())).orElseGet(() -> {
GrantedObjAuthority> newAuths = new GrantedObjAuthority<>( auth .getAuthId() , new ArrayList<>()) ;
contain .put( auth .getAuthId() , newAuths) ;
return newAuths ;
}) ;
selectedAuths.getAuth().add(auth) ;
}
contain.put( "ROLE_AUTH" , new GrantedObjAuthority>( "ROLE_AUTH" , null )) ;
return contain.values() ;
}
@JsonIgnore
@Override
public String getPassword () {
return getAdmLginPw() ;
}
@Override
public String getUsername () {
return getAdmNm() ;
}
@Override
public boolean isAccountNonExpired () {
return UseCd. USE001 .equals(getUseCd()) ;
}
@Override
public boolean isAccountNonLocked () {
return UseCd. USE001 .equals(getUseCd()) ;
}
@Override
public boolean isCredentialsNonExpired () {
return UseCd. USE001 .equals(getUseCd()) ;
}
@Override
public boolean isEnabled () {
return UseCd. USE001 .equals(getUseCd()) ;
}
}
https://github.com/visualkhh/lib-spring/tree/master/boot/single-angular-swagger-jpa-typescript
from http://life-journey.tistory.com/32 by ccl(A) rewrite - 2021-02-05 12:26:33