shjung 2 жил өмнө
parent
commit
7e59b353db

+ 18 - 0
pom.xml

@@ -26,6 +26,10 @@
 
     <properties>
         <java.version>1.8</java.version>
+        <swagger.version>2.9.2</swagger.version>
+        <org.projectlombok.version>1.18.20</org.projectlombok.version>
+        <org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
+        <jackson.version>2.13.1</jackson.version>
         <!-- jar 배포용 -->
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
@@ -38,6 +42,20 @@
     </properties>
 
     <dependencies>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>${swagger.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>${swagger.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.fusesource.jansi</groupId>
             <artifactId>jansi</artifactId>

+ 10 - 0
src/main/java/com/its/wthr/WthrCommServerApplication.java

@@ -34,7 +34,9 @@ import java.awt.event.WindowEvent;
 import java.io.File;
 import java.io.IOException;
 import java.io.PrintStream;
+import java.lang.reflect.Field;
 import java.net.URL;
+import java.nio.charset.Charset;
 import java.text.SimpleDateFormat;
 
 @Slf4j
@@ -48,6 +50,14 @@ public class WthrCommServerApplication implements CommandLineRunner, Application
     private static final String applicationName = "wthr-comm-server";
 
     public static void main(String[] args) {
+        System.setProperty("file.encoding","UTF-8");
+        try {
+            Field charset = Charset.class.getDeclaredField("defaultCharset");
+            charset.setAccessible(true);
+            charset.set(null,null);
+        } catch(Exception e){
+        }
+
         File file1 = new File("./conf/" + applicationName + ".pid");
         if (file1.exists()) {
             System.out.println(System.getProperty("Program Already Running....."));

+ 55 - 0
src/main/java/com/its/wthr/config/SwaggerConfig.java

@@ -0,0 +1,55 @@
+package com.its.wthr.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpHeaders;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Parameter;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+
+    @Bean
+    public Docket commonApi() {
+        Parameter parameterBuilder = new ParameterBuilder()
+                .name(HttpHeaders.AUTHORIZATION)
+                .description("Access Token")
+                .modelRef(new ModelRef("string"))
+                .parameterType("header")
+                .required(false)
+                .build();
+
+        List<Parameter> globalParameters = new ArrayList<>();
+        globalParameters.add(parameterBuilder);
+        return new Docket(DocumentationType.SWAGGER_2)
+                .globalOperationParameters(globalParameters)
+                .groupName("wthr-api")
+                .apiInfo(this.apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.its.wthr.api.controller"))
+                .paths(PathSelectors.any())
+                //.paths(PathSelectors.ant("/api/**"))
+                .build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("Weather Control API")
+                .description("Weather Communication Server API")
+                .version("0.0.1")
+                .build();
+    }
+
+}

+ 73 - 57
src/main/java/com/its/wthr/webapp/config/WebSecurityConfig.java

@@ -1,9 +1,10 @@
 package com.its.wthr.webapp.config;
 
-import com.its.wthr.webapp.config.service.UserService;
 import com.its.wthr.webapp.security.SessionListener;
+import com.its.wthr.webapp.service.UserService;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpMethod;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.builders.WebSecurity;
@@ -19,65 +20,80 @@ import javax.servlet.http.HttpSessionListener;
 @EnableWebSecurity
 @Configuration
 public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
-	private final UserService userService;
+    private final UserService userService;
 
-	public WebSecurityConfig(UserService userService) {
-		this.userService = userService;
-	}
+    public WebSecurityConfig(UserService userService) {
+        this.userService = userService;
+    }
 
-	public void configure(WebSecurity web) throws Exception {
-		web.ignoring().antMatchers(new String[]{"/css/**", "/js/**", "/img/**", "/lib/**"});
-	}
+    @Override
+    public void configure(WebSecurity web) throws Exception {
+        web.ignoring().antMatchers("/favicon.ico");
+        web.ignoring().antMatchers(new String[]{"/css/**", "/js/**", "/img/**", "/lib/**"});
 
-	protected void configure(HttpSecurity http) throws Exception {
-		
-		http.authorizeRequests()
-			.antMatchers(new String[]{"/index"})
-			.hasRole("ADMIN")
-			.antMatchers(new String[]{"/**"})
-			.hasRole("ADMIN")
-		.and()
-			.formLogin()
-			.loginPage("/login")
-			.defaultSuccessUrl("/index")
-			.failureUrl("/denied")
-			.permitAll()
-		.and()
-			.logout()
-			.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
-			.logoutSuccessUrl("/login").invalidateHttpSession(true)
-			.deleteCookies()
-		.and()
-			.exceptionHandling()
-			.accessDeniedPage("/denied");
-		
-		http
-			.csrf()
-			.disable();
-		
-		http
-			.sessionManagement()
-			.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
-			.invalidSessionUrl("/login")
-			.sessionFixation()
-			.migrateSession()
-			.maximumSessions(5)
-			.maxSessionsPreventsLogin(true)
-			.expiredUrl("/login")
-			.sessionRegistry(this.sessionRegistry());
-	}
+        web.ignoring().antMatchers(HttpMethod.GET, "/api/**");  // GET Method 는 모두 통과
+        web.ignoring().antMatchers(HttpMethod.POST, "/api/**");  // GET Method 는 모두 통과
+        web.ignoring().antMatchers(HttpMethod.PUT, "/api/**");  // GET Method 는 모두 통과
+        web.ignoring().antMatchers(HttpMethod.DELETE, "/api/**");  // GET Method 는 모두 통과
+    }
 
-	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
-		auth.userDetailsService(this.userService);
-	}
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
 
-	@Bean
-	public SessionRegistry sessionRegistry() {
-		return new SessionRegistryImpl();
-	}
+        http.authorizeRequests()
+                // SWAGGER 권한 설정
+                .antMatchers("/swagger-ui.html", "/swagger/**", "/swagger-resources/**", "/webjars/**", "/v2/api-docs").permitAll()
+                // 웹소켓 권한 설정하지
+                .antMatchers("/ws/**").permitAll()
+                .antMatchers("/api/**").permitAll()
+                .antMatchers(new String[]{"/index"})
+                .hasRole("ADMIN")
+                .antMatchers(new String[]{"/**"})
+                .hasRole("ADMIN")
+                .and()
+                .formLogin()
+                .loginPage("/login")
+                .defaultSuccessUrl("/index")
+                .failureUrl("/denied")
+                .permitAll()
+                .and()
+                .logout()
+                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
+                .logoutSuccessUrl("/login").invalidateHttpSession(true)
+                .deleteCookies()
+                .and()
+                .exceptionHandling()
+                .accessDeniedPage("/denied");
+
+        http
+                .csrf()
+                .disable();
+
+        http
+                .sessionManagement()
+                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
+                .invalidSessionUrl("/login")
+                .sessionFixation()
+                .migrateSession()
+                .maximumSessions(5)
+                .maxSessionsPreventsLogin(true)
+                .expiredUrl("/login")
+                .sessionRegistry(this.sessionRegistry());
+    }
+
+    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+        auth.userDetailsService(this.userService);
+    }
+
+    @Bean
+    public SessionRegistry sessionRegistry() {
+        return new SessionRegistryImpl();
+    }
+
+    @Bean
+    public HttpSessionListener httpSessionListener() {
+        return new SessionListener();
+    }
+
+}
 
-	@Bean
-	public HttpSessionListener httpSessionListener() {
-		return new SessionListener();
-	}
-}

+ 1 - 1
src/main/java/com/its/wthr/webapp/controller/WebAppCommonController.java

@@ -3,7 +3,7 @@ package com.its.wthr.webapp.controller;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.its.app.utils.Ping;
 import com.its.wthr.config.ServerConfig;
-import com.its.wthr.webapp.config.service.FileService;
+import com.its.wthr.webapp.service.FileService;
 import com.its.wthr.webapp.vo.FileInfoVo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.core.io.Resource;

+ 1 - 1
src/main/java/com/its/wthr/webapp/controller/WebAppController.java

@@ -7,7 +7,7 @@ import com.its.wthr.service.AtmpService;
 import com.its.wthr.service.FrcsService;
 import com.its.wthr.vo.AtmpPltnVo;
 import com.its.wthr.vo.FrcsZoneVo;
-import com.its.wthr.webapp.config.service.FileService;
+import com.its.wthr.webapp.service.FileService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.core.io.ResourceLoader;
 import org.springframework.stereotype.Controller;

+ 1 - 1
src/main/java/com/its/wthr/webapp/security/UserAuthenticationProvider.java

@@ -1,6 +1,6 @@
 package com.its.wthr.webapp.security;
 
-import com.its.wthr.webapp.config.service.UserService;
+import com.its.wthr.webapp.service.UserService;
 import com.its.wthr.webapp.vo.UserVo;
 import org.springframework.security.authentication.AuthenticationProvider;
 import org.springframework.security.authentication.BadCredentialsException;

+ 1 - 1
src/main/java/com/its/wthr/webapp/config/service/FileService.java → src/main/java/com/its/wthr/webapp/service/FileService.java

@@ -1,4 +1,4 @@
-package com.its.wthr.webapp.config.service;
+package com.its.wthr.webapp.service;
 
 import com.its.app.utils.OS;
 import com.its.wthr.webapp.vo.FileInfoVo;

+ 1 - 1
src/main/java/com/its/wthr/webapp/config/service/UserService.java → src/main/java/com/its/wthr/webapp/service/UserService.java

@@ -1,4 +1,4 @@
-package com.its.wthr.webapp.config.service;
+package com.its.wthr.webapp.service;
 
 import com.its.wthr.webapp.vo.UserVo;
 import org.springframework.beans.factory.annotation.Value;