diff --git a/springcloud/apigateway-service/src/main/resources/application.yml b/springcloud/apigateway-service/src/main/resources/application.yml index b3bf703d..8302aaee 100644 --- a/springcloud/apigateway-service/src/main/resources/application.yml +++ b/springcloud/apigateway-service/src/main/resources/application.yml @@ -25,14 +25,20 @@ spring: uri: lb://ORDER-SERVICE predicates: - Path=/order-service/** + - id: catalog-service uri: lb://CATALOG-SERVICE predicates: - Path=/catalog-service/** + - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/** + filters: + - RemoveRequestHeader=Cookie + - RewritePath=/user-service/(?.*), /$\{segment} + - id: first-service uri: lb://MY-FIRST-SERVICE predicates: @@ -41,6 +47,7 @@ spring: # - AddRequestHeader=first-request, first-request-header2 # - AddResponseHeader=first-response, first-response-header2 - CustomFilter + - id: second-service uri: lb://MY-SECOND-SERVICE predicates: diff --git a/springcloud/user-service/build.gradle b/springcloud/user-service/build.gradle index 52e999fa..07e41edd 100644 --- a/springcloud/user-service/build.gradle +++ b/springcloud/user-service/build.gradle @@ -30,6 +30,7 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation group: 'org.modelmapper', name: 'modelmapper', version: '2.4.4' + implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.1' runtimeOnly group: 'com.h2database', name: 'h2', version: '1.3.176' compileOnly 'org.projectlombok:lombok' diff --git a/springcloud/user-service/src/main/java/com/example/userservice/controller/UserController.java b/springcloud/user-service/src/main/java/com/example/userservice/controller/UserController.java index d70687f2..5738dec7 100644 --- a/springcloud/user-service/src/main/java/com/example/userservice/controller/UserController.java +++ b/springcloud/user-service/src/main/java/com/example/userservice/controller/UserController.java @@ -20,7 +20,7 @@ import java.util.List; @RestController @RequiredArgsConstructor -@RequestMapping("/user-service") +@RequestMapping("/") public class UserController { private final Greeting greeting; diff --git a/springcloud/user-service/src/main/java/com/example/userservice/security/AuthenticationFilter.java b/springcloud/user-service/src/main/java/com/example/userservice/security/AuthenticationFilter.java index b3d3b52a..25ff7d16 100644 --- a/springcloud/user-service/src/main/java/com/example/userservice/security/AuthenticationFilter.java +++ b/springcloud/user-service/src/main/java/com/example/userservice/security/AuthenticationFilter.java @@ -1,10 +1,19 @@ package com.example.userservice.security; +import com.example.userservice.dto.UserDto; +import com.example.userservice.service.UserService; import com.example.userservice.vo.RequestLogin; import com.fasterxml.jackson.databind.ObjectMapper; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.env.Environment; +import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.User; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import javax.servlet.FilterChain; @@ -13,9 +22,21 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; +import java.util.Date; +@Slf4j public class AuthenticationFilter extends UsernamePasswordAuthenticationFilter { + private final UserService userService; + private final Environment env; + + public AuthenticationFilter(AuthenticationManager authenticationManager, + UserService userService, Environment env) { + super.setAuthenticationManager(authenticationManager); + this.userService = userService; + this.env = env; + } + @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { @@ -39,5 +60,17 @@ public class AuthenticationFilter extends UsernamePasswordAuthenticationFilter { HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { + String username = ((User) authResult.getPrincipal()).getUsername(); + UserDto userDetails = userService.getUserDetailByEmail(username); + + String token = Jwts.builder() + .setSubject(userDetails.getUserId()) + .setExpiration(new Date(System.currentTimeMillis() + + Long.parseLong(env.getProperty("token.expiration_time")))) + .signWith(SignatureAlgorithm.HS512, env.getProperty("token.secret")) + .compact(); + + response.addHeader("token", token); + response.addHeader("userId", userDetails.getUserId()); } } diff --git a/springcloud/user-service/src/main/java/com/example/userservice/security/WebSecurity.java b/springcloud/user-service/src/main/java/com/example/userservice/security/WebSecurity.java index c895d532..84e6987c 100644 --- a/springcloud/user-service/src/main/java/com/example/userservice/security/WebSecurity.java +++ b/springcloud/user-service/src/main/java/com/example/userservice/security/WebSecurity.java @@ -39,10 +39,7 @@ public class WebSecurity extends WebSecurityConfigurerAdapter { } private AuthenticationFilter getAuthenticationFilter() throws Exception { - AuthenticationFilter authenticationFilter = new AuthenticationFilter(); - authenticationFilter.setAuthenticationManager(authenticationManager()); - - return authenticationFilter; + return new AuthenticationFilter(authenticationManager(), userService, env); } diff --git a/springcloud/user-service/src/main/java/com/example/userservice/service/UserService.java b/springcloud/user-service/src/main/java/com/example/userservice/service/UserService.java index a1724b5a..7058c5bd 100644 --- a/springcloud/user-service/src/main/java/com/example/userservice/service/UserService.java +++ b/springcloud/user-service/src/main/java/com/example/userservice/service/UserService.java @@ -11,4 +11,6 @@ public interface UserService extends UserDetailsService { void createUser(UserDto userDto); UserDto getUserByUserId(String userId); List gerUserByAll(); + UserDto getUserDetailByEmail(String username); + } diff --git a/springcloud/user-service/src/main/java/com/example/userservice/service/UserServiceImpl.java b/springcloud/user-service/src/main/java/com/example/userservice/service/UserServiceImpl.java index d878687b..e8dafe59 100644 --- a/springcloud/user-service/src/main/java/com/example/userservice/service/UserServiceImpl.java +++ b/springcloud/user-service/src/main/java/com/example/userservice/service/UserServiceImpl.java @@ -60,4 +60,12 @@ public class UserServiceImpl implements UserService { true, true, true, true, new ArrayList<>()); } + + @Override + public UserDto getUserDetailByEmail(String email) { + UserEntity userEntity = userRepository.findByEmail(email) + .orElseThrow(() -> new UsernameNotFoundException(email)); + + return mapper.map(userEntity, UserDto.class); + } } diff --git a/springcloud/user-service/src/main/resources/application.yml b/springcloud/user-service/src/main/resources/application.yml index 93317439..37f6177d 100644 --- a/springcloud/user-service/src/main/resources/application.yml +++ b/springcloud/user-service/src/main/resources/application.yml @@ -26,4 +26,12 @@ eureka: defaultZone: http://127.0.0.1:8761/eureka #등록 위치 greeting: - message: Welcome to Simple E-commerce. \ No newline at end of file + message: Welcome to Simple E-commerce. + +logging: + level: + com.example.userservice: DEBUG + +token: + expiration_time: 86400000 + secret: user_token \ No newline at end of file