From 2eef7786bdda9d9f09d9327f8a2d9e43c9d8658c Mon Sep 17 00:00:00 2001 From: Elex Date: Sun, 8 Aug 2021 17:09:59 +0900 Subject: [PATCH] 2021-08-08 --- exception/build.gradle.kts | 27 ++++++++++ .../java/kr/pe/elex/examples/Application.java | 20 ++++++++ .../kr/pe/elex/examples/MyController.java | 49 +++++++++++++++++++ .../pe/elex/examples/MyExceptionHandler.java | 20 ++++++++ .../java/kr/pe/elex/examples/MyService.java | 14 ++++++ .../kr/pe/elex/examples/package-info.java | 8 +++ exception/src/main/resources/application.yaml | 9 ++++ exception/src/main/resources/banner.txt | 10 ++++ .../src/main/resources/logback-spring.xml | 48 ++++++++++++++++++ .../main/resources/templates/main.mustache | 15 ++++++ .../pe/elex/examples/JwtExceptionHandler.java | 30 ++++++++++++ .../kr/pe/elex/examples/JwtInterceptor.java | 34 +++++++++++++ .../pe/elex/examples/SampleInterceptor.java | 18 +++++++ .../kr/pe/elex/examples/SecurityConfig.java | 3 +- .../java/kr/pe/elex/examples/WebConfig.java | 18 +++++++ settings.gradle.kts | 2 +- 16 files changed, 323 insertions(+), 2 deletions(-) create mode 100644 exception/build.gradle.kts create mode 100644 exception/src/main/java/kr/pe/elex/examples/Application.java create mode 100644 exception/src/main/java/kr/pe/elex/examples/MyController.java create mode 100644 exception/src/main/java/kr/pe/elex/examples/MyExceptionHandler.java create mode 100644 exception/src/main/java/kr/pe/elex/examples/MyService.java create mode 100644 exception/src/main/java/kr/pe/elex/examples/package-info.java create mode 100644 exception/src/main/resources/application.yaml create mode 100644 exception/src/main/resources/banner.txt create mode 100644 exception/src/main/resources/logback-spring.xml create mode 100644 exception/src/main/resources/templates/main.mustache create mode 100644 security-with-jwt/src/main/java/kr/pe/elex/examples/JwtExceptionHandler.java create mode 100644 security-with-jwt/src/main/java/kr/pe/elex/examples/JwtInterceptor.java create mode 100644 security-with-jwt/src/main/java/kr/pe/elex/examples/SampleInterceptor.java diff --git a/exception/build.gradle.kts b/exception/build.gradle.kts new file mode 100644 index 0000000..b6071fc --- /dev/null +++ b/exception/build.gradle.kts @@ -0,0 +1,27 @@ +/* + * Spring-boot Examples + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +plugins { + id("elex-spring-boot") + + id("org.springframework.boot") version "2.5.3" + id("io.spring.dependency-management") version "1.0.11.RELEASE" +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-mustache") + + compileOnly("org.projectlombok:lombok") + developmentOnly("org.springframework.boot:spring-boot-devtools") + + annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") + annotationProcessor("org.projectlombok:lombok") + + testImplementation("org.springframework.boot:spring-boot-starter-test") + +} diff --git a/exception/src/main/java/kr/pe/elex/examples/Application.java b/exception/src/main/java/kr/pe/elex/examples/Application.java new file mode 100644 index 0000000..7ff4bbf --- /dev/null +++ b/exception/src/main/java/kr/pe/elex/examples/Application.java @@ -0,0 +1,20 @@ +/* + * Spring-boot Examples + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/exception/src/main/java/kr/pe/elex/examples/MyController.java b/exception/src/main/java/kr/pe/elex/examples/MyController.java new file mode 100644 index 0000000..2579cef --- /dev/null +++ b/exception/src/main/java/kr/pe/elex/examples/MyController.java @@ -0,0 +1,49 @@ +/* + * Spring-boot Examples + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples; + +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.Resource; +import org.springframework.http.ContentDisposition; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import java.util.HashMap; + +@Slf4j +@Controller +public class MyController { + @Autowired + private MyService service; + + @GetMapping(path = {"/m1"}) + public String index() throws Exception { + service.doSomething("illegal"); + return "main"; + } + @GetMapping(path = {"/m2"}) + public String index2() throws Exception { + service.doSomething("exception"); + return "main"; + } + + @ExceptionHandler(IllegalArgumentException.class) + public ResponseEntity handleException(Throwable e){ + log.debug("Handled by {}.", getClass().getName()); + HashMap resp = new HashMap<>(); + resp.put("message",e.getMessage()); + return ResponseEntity.badRequest().body(resp); + } +} diff --git a/exception/src/main/java/kr/pe/elex/examples/MyExceptionHandler.java b/exception/src/main/java/kr/pe/elex/examples/MyExceptionHandler.java new file mode 100644 index 0000000..5422249 --- /dev/null +++ b/exception/src/main/java/kr/pe/elex/examples/MyExceptionHandler.java @@ -0,0 +1,20 @@ +package kr.pe.elex.examples; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.util.HashMap; + +@Slf4j +@RestControllerAdvice +public class MyExceptionHandler { + @ExceptionHandler(Exception.class) + public ResponseEntity handleException(Throwable e){ + log.debug("Handled by {}.", getClass().getName()); + HashMap resp = new HashMap<>(); + resp.put("message",e.getMessage()); + return ResponseEntity.badRequest().body(resp); + } +} diff --git a/exception/src/main/java/kr/pe/elex/examples/MyService.java b/exception/src/main/java/kr/pe/elex/examples/MyService.java new file mode 100644 index 0000000..c68c036 --- /dev/null +++ b/exception/src/main/java/kr/pe/elex/examples/MyService.java @@ -0,0 +1,14 @@ +package kr.pe.elex.examples; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class MyService { + public String doSomething(String param) throws IllegalArgumentException, Exception { + if ("illegal" == param) throw new IllegalArgumentException("Oops~"); + if ("exception" == param) throw new Exception("Oops~"); + return "Hello"; + } +} diff --git a/exception/src/main/java/kr/pe/elex/examples/package-info.java b/exception/src/main/java/kr/pe/elex/examples/package-info.java new file mode 100644 index 0000000..ce9cc62 --- /dev/null +++ b/exception/src/main/java/kr/pe/elex/examples/package-info.java @@ -0,0 +1,8 @@ +/* + * Spring-boot Examples + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples; diff --git a/exception/src/main/resources/application.yaml b/exception/src/main/resources/application.yaml new file mode 100644 index 0000000..8448219 --- /dev/null +++ b/exception/src/main/resources/application.yaml @@ -0,0 +1,9 @@ +spring: + application: + name: My spring-boot project + servlet: + multipart: + max-file-size: 128KB + max-request-size: 128KB +server: + port: 8080 diff --git a/exception/src/main/resources/banner.txt b/exception/src/main/resources/banner.txt new file mode 100644 index 0000000..f7a35db --- /dev/null +++ b/exception/src/main/resources/banner.txt @@ -0,0 +1,10 @@ + ('-. ('-. ) (`-. + _( OO) _( OO) ( OO ). +(,------.,--. (,------.(_/. \_)-. + | .---'| |.-') | .---' \ `.' / + | | | | OO ) | | \ /\ +(| '--. | |`-' |(| '--. \ \ | + | .--'(| '---.' | .--' .' \_) + | `---.| | | `---. / .'. \ + `------'`------' `------''--' '--' +powered by ELEX diff --git a/exception/src/main/resources/logback-spring.xml b/exception/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..19f023b --- /dev/null +++ b/exception/src/main/resources/logback-spring.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + UTF-8 + ${FILE_LOG_PATTERN} + + ${LOG_PATH} + + ${LOG_DIR}/sebastian_%d{yyyy-MM-dd}_%i.log.gz + + 10MB + + 60 + + + + + + + + + + + + + diff --git a/exception/src/main/resources/templates/main.mustache b/exception/src/main/resources/templates/main.mustache new file mode 100644 index 0000000..811061b --- /dev/null +++ b/exception/src/main/resources/templates/main.mustache @@ -0,0 +1,15 @@ +

File Upload Example!!!

+
+ + +
+ +
+
+

Uploaded Files

+

Click to download.

+
    + {{#files}} +
  • {{.}}
  • + {{/files}} +
diff --git a/security-with-jwt/src/main/java/kr/pe/elex/examples/JwtExceptionHandler.java b/security-with-jwt/src/main/java/kr/pe/elex/examples/JwtExceptionHandler.java new file mode 100644 index 0000000..e542861 --- /dev/null +++ b/security-with-jwt/src/main/java/kr/pe/elex/examples/JwtExceptionHandler.java @@ -0,0 +1,30 @@ +package kr.pe.elex.examples; + +import io.jsonwebtoken.*; +import io.jsonwebtoken.security.SignatureException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +//@RestControllerAdvice +@Deprecated +public class JwtExceptionHandler { + + @ExceptionHandler({IncorrectClaimException.class, MissingClaimException.class, ExpiredJwtException.class, + SignatureException.class, MalformedJwtException.class, UnsupportedJwtException.class}) + public ResponseEntity onEx(Throwable e) { + log.error("Oops~!!!", e); + + Map data = new HashMap<>(); + data.put("message", e.getMessage()); + data.put("errorCode", HttpServletResponse.SC_BAD_REQUEST); + return ResponseEntity.badRequest().body(data); + } + +} diff --git a/security-with-jwt/src/main/java/kr/pe/elex/examples/JwtInterceptor.java b/security-with-jwt/src/main/java/kr/pe/elex/examples/JwtInterceptor.java new file mode 100644 index 0000000..f1481e6 --- /dev/null +++ b/security-with-jwt/src/main/java/kr/pe/elex/examples/JwtInterceptor.java @@ -0,0 +1,34 @@ +package kr.pe.elex.examples; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Slf4j +//@Component +@Deprecated +public class JwtInterceptor implements HandlerInterceptor { + @Autowired + private JwtService jwtService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + //final HttpServletRequest httpServletRequest = (HttpServletRequest) request; + log.info("Interceptor Triggered!! {}", getClass().getName()); + final String authHeader = request.getHeader("Authorization"); + if (null != authHeader) { + Authentication authentication = jwtService.getAuthentication(authHeader); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + return true; + //return HandlerInterceptor.super.preHandle(request, response, handler); + } + +} diff --git a/security-with-jwt/src/main/java/kr/pe/elex/examples/SampleInterceptor.java b/security-with-jwt/src/main/java/kr/pe/elex/examples/SampleInterceptor.java new file mode 100644 index 0000000..6ac1dcd --- /dev/null +++ b/security-with-jwt/src/main/java/kr/pe/elex/examples/SampleInterceptor.java @@ -0,0 +1,18 @@ +package kr.pe.elex.examples; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Slf4j +@Component +public class SampleInterceptor implements HandlerInterceptor { + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + log.info("Interceptor triggered!!! {}", getClass().getName()); + return true; + } +} diff --git a/security-with-jwt/src/main/java/kr/pe/elex/examples/SecurityConfig.java b/security-with-jwt/src/main/java/kr/pe/elex/examples/SecurityConfig.java index 9a37cd5..1d18493 100644 --- a/security-with-jwt/src/main/java/kr/pe/elex/examples/SecurityConfig.java +++ b/security-with-jwt/src/main/java/kr/pe/elex/examples/SecurityConfig.java @@ -37,7 +37,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { http.authorizeRequests() .antMatchers("/", "/info", "/h2-console").permitAll() // 아무나 접근 가능 .antMatchers("/h2-console/**").permitAll() // H2콘솔을 쓰기 위해 추가했음 - .antMatchers("/api/signin").permitAll() + .antMatchers("/api/signin", "/hello/**").permitAll() .antMatchers("/api/**").authenticated() //.antMatchers("/admin").hasAnyRole("ADMIN") @@ -62,6 +62,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class) .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + ; } diff --git a/security-with-jwt/src/main/java/kr/pe/elex/examples/WebConfig.java b/security-with-jwt/src/main/java/kr/pe/elex/examples/WebConfig.java index a502280..6b7389a 100644 --- a/security-with-jwt/src/main/java/kr/pe/elex/examples/WebConfig.java +++ b/security-with-jwt/src/main/java/kr/pe/elex/examples/WebConfig.java @@ -13,12 +13,17 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.Authentication; +import org.springframework.util.AntPathMatcher; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Slf4j @Configuration +@EnableWebMvc public class WebConfig implements WebMvcConfigurer { + //@Autowired + //private JwtInterceptor jwtInterceptor; /* @Override public void addViewControllers(@NotNull ViewControllerRegistry registry) { @@ -26,4 +31,17 @@ public class WebConfig implements WebMvcConfigurer { } */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + //WebMvcConfigurer.super.addInterceptors(registry); + //registry.addInterceptor(jwtInterceptor) + //.pathMatcher(new AntPathMatcher()) + //.addPathPatterns("/**") + //.excludePathPatterns("/api/signin") + ; + //registry.addInterceptor(new SampleInterceptor()) + // .addPathPatterns("/hello/**") + //.pathMatcher(new AntPathMatcher()) + ; + } } diff --git a/settings.gradle.kts b/settings.gradle.kts index b8177e8..813a454 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,5 +9,5 @@ rootProject.name = "spring-boot-examples" include( "file-upload", "security", "security-with-jpa", "validation", "testing", "mqtt", "websocket", "restful", "swing", "rest-doc", - "cache", "security-with-jwt" + "cache", "security-with-jwt", "exception" )