update
This commit is contained in:
@@ -1,10 +1,7 @@
|
||||
package org.egovframe.cloud.userservice.api.role;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.validation.Valid;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.egovframe.cloud.common.dto.RequestDto;
|
||||
import org.egovframe.cloud.userservice.api.role.dto.AuthorizationListResponseDto;
|
||||
import org.egovframe.cloud.userservice.api.role.dto.AuthorizationResponseDto;
|
||||
@@ -18,17 +15,11 @@ import org.springframework.data.web.PageableDefault;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.GrantedAuthority;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.PutMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.userservice.api.role.AuthorizationApiController
|
||||
|
||||
@@ -1,27 +1,10 @@
|
||||
package org.egovframe.cloud.userservice.api.user;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.security.GeneralSecurityException;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.egovframe.cloud.common.dto.RequestDto;
|
||||
import org.egovframe.cloud.common.exception.BusinessMessageException;
|
||||
import org.egovframe.cloud.common.util.MessageUtil;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.UserEmailRequestDto;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.UserFindPasswordSaveRequestDto;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.UserFindPasswordUpdateRequestDto;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.UserJoinRequestDto;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.UserListResponseDto;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.UserPasswordMatchRequestDto;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.UserPasswordUpdateRequestDto;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.UserResponseDto;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.UserSaveRequestDto;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.UserUpdateInfoRequestDto;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.UserUpdateRequestDto;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.UserVerifyRequestDto;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.*;
|
||||
import org.egovframe.cloud.userservice.config.TokenProvider;
|
||||
import org.egovframe.cloud.userservice.service.user.UserService;
|
||||
import org.springframework.core.env.Environment;
|
||||
@@ -29,15 +12,13 @@ import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.PutMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.io.IOException;
|
||||
import java.security.GeneralSecurityException;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.userservice.api.user.UserApiController
|
||||
@@ -149,6 +130,17 @@ public class UserApiController {
|
||||
tokenProvider.refreshToken(refreshToken, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 사용자 회원 가입
|
||||
*
|
||||
* @param requestDto 사용자 가입 요청 DTO
|
||||
* @return Boolean 성공 여부
|
||||
*/
|
||||
@PostMapping("/api/v1/users/social")
|
||||
public SocialUserResponseDto social(@RequestBody @Valid SocialUserRequestDto requestDto) {
|
||||
return userService.getSocialUserInfo(requestDto.getProvider(), requestDto.getToken());
|
||||
}
|
||||
|
||||
/**
|
||||
* 이메일 중복 확인
|
||||
*
|
||||
|
||||
@@ -33,24 +33,43 @@ import java.util.UUID;
|
||||
@NoArgsConstructor
|
||||
public class UserJoinRequestDto {
|
||||
|
||||
/**
|
||||
* 사용자 이름
|
||||
*/
|
||||
@NotBlank(message = "{user.user_name}{valid.required}")
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* 이메일
|
||||
*/
|
||||
@NotBlank(message = "{user.email}{valid.required}")
|
||||
@Email
|
||||
private String email;
|
||||
|
||||
/**
|
||||
* 비밀번호
|
||||
*/
|
||||
// (숫자)(영문)(특수문자)(공백제거)(자리수)
|
||||
@Pattern(regexp = "(?=.*[0-9])(?=.*[a-zA-Z])(?=.*\\W)(?=\\S+$).{8,20}",
|
||||
message = "{valid.password}")
|
||||
private String password;
|
||||
|
||||
/**
|
||||
* 소셜 공급자
|
||||
*/
|
||||
private String provider;
|
||||
|
||||
/**
|
||||
* 소셜 토큰
|
||||
*/
|
||||
private String token;
|
||||
|
||||
/**
|
||||
* UserSaveRequestDto 의 필드 값을 User Entity 빌더를 사용하여 주입 후 User를 리턴한다.
|
||||
* UserSaveRequestDto 가 가지고 있는 User 의 필드만 세팅할 수 있게 된다.
|
||||
*
|
||||
* @param passwordEncoder
|
||||
* @return
|
||||
* @param passwordEncoder 비밀번호 인코더
|
||||
* @return User 사용자 엔티티
|
||||
*/
|
||||
public User toEntity(BCryptPasswordEncoder passwordEncoder) {
|
||||
return User.builder()
|
||||
|
||||
@@ -1,19 +1,17 @@
|
||||
package org.egovframe.cloud.userservice.api.user.dto;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.validation.constraints.Email;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.Pattern;
|
||||
|
||||
import org.egovframe.cloud.common.domain.Role;
|
||||
import org.egovframe.cloud.userservice.domain.user.User;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.egovframe.cloud.common.domain.Role;
|
||||
import org.egovframe.cloud.userservice.domain.user.User;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
|
||||
import javax.validation.constraints.Email;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.Pattern;
|
||||
import java.util.Arrays;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.userservice.api.user.dto.UserSaveRequestDto
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package org.egovframe.cloud.userservice.api.user.dto;
|
||||
|
||||
import javax.validation.constraints.Email;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.Pattern;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.Email;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.Pattern;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.userservice.api.user.dto.UserUpdateRequestDto
|
||||
* <p>
|
||||
|
||||
@@ -1,21 +1,9 @@
|
||||
package org.egovframe.cloud.userservice.config;
|
||||
|
||||
import static org.egovframe.cloud.common.config.GlobalConstant.LOGIN_URI;
|
||||
import static org.springframework.util.StringUtils.hasLength;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import io.jsonwebtoken.Claims;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.egovframe.cloud.common.exception.BusinessException;
|
||||
import org.egovframe.cloud.common.util.LogUtil;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.UserLoginRequestDto;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.UserResponseDto;
|
||||
@@ -34,10 +22,19 @@ import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import io.jsonwebtoken.Claims;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import static org.springframework.util.StringUtils.hasLength;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.userservice.config.AuthenticationFilter
|
||||
@@ -76,11 +73,11 @@ public class AuthenticationFilter extends UsernamePasswordAuthenticationFilter {
|
||||
* @param request http 요청
|
||||
* @param response http 응답
|
||||
* @return Authentication 인증정보
|
||||
* @throws NullPointerException 널 포인터 예외
|
||||
* @throws Exception 예외
|
||||
* @throws IOException 입출력 예외
|
||||
* @throws Exception 예외
|
||||
*/
|
||||
@Override
|
||||
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
|
||||
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) {
|
||||
try {
|
||||
// 사용자가 입력한 인증정보 받기, POST method 값이기 때문에 input stream으로 받았다.
|
||||
UserLoginRequestDto creds = new ObjectMapper().readValue(request.getInputStream(), UserLoginRequestDto.class);
|
||||
@@ -108,12 +105,12 @@ public class AuthenticationFilter extends UsernamePasswordAuthenticationFilter {
|
||||
// 인증정보 만들기
|
||||
return getAuthenticationManager().authenticate(upat);
|
||||
}
|
||||
} catch (NullPointerException e) {
|
||||
} catch (IOException e) {
|
||||
log.error(e.getLocalizedMessage());
|
||||
throw new RuntimeException(e);
|
||||
} catch (Exception e) {
|
||||
log.error(e.getLocalizedMessage());
|
||||
throw new RuntimeException(e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -163,46 +160,41 @@ public class AuthenticationFilter extends UsernamePasswordAuthenticationFilter {
|
||||
* @param request
|
||||
* @param response
|
||||
* @param chain
|
||||
* @throws IOException
|
||||
* @throws ServletException
|
||||
*/
|
||||
@Override
|
||||
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
|
||||
HttpServletRequest httpRequest = (HttpServletRequest) request;
|
||||
String token = httpRequest.getHeader(HttpHeaders.AUTHORIZATION);
|
||||
if (!hasLength(token) || "undefined".equals(token)) {
|
||||
super.doFilter(request, response, chain);
|
||||
} else {
|
||||
try {
|
||||
final String requestURI = httpRequest.getRequestURI();
|
||||
log.info("httpRequest.getRequestURI() ={}", requestURI);
|
||||
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
|
||||
try {
|
||||
HttpServletRequest httpRequest = (HttpServletRequest) request;
|
||||
String token = httpRequest.getHeader(HttpHeaders.AUTHORIZATION);
|
||||
if (!hasLength(token) || "undefined".equals(token)) {
|
||||
super.doFilter(request, response, chain);
|
||||
} else {
|
||||
// 토큰 유효성 검사는 API Gateway ReactiveAuthorization 클래스에서 미리 처리된다.
|
||||
Claims claims = tokenProvider.getClaimsFromToken(token);
|
||||
|
||||
if (LOGIN_URI.equals(requestURI)) {
|
||||
// 로그인 등 토큰 정보를 꺼낼 필요가 없는 경우
|
||||
String username = claims.getSubject();
|
||||
if (username == null) {
|
||||
// refresh token 에는 subject, authorities 정보가 없다.
|
||||
SecurityContextHolder.getContext().setAuthentication(null);
|
||||
} else {
|
||||
// 토큰 유효성 검사는 API Gateway ReactiveAuthorization 클래스에서 미리 처리된다.
|
||||
Claims claims = tokenProvider.getClaimsFromToken(token);
|
||||
|
||||
String username = claims.getSubject();
|
||||
if (username == null) {
|
||||
// refresh token 에는 subject, authorities 정보가 없다.
|
||||
SecurityContextHolder.getContext().setAuthentication(null);
|
||||
} else {
|
||||
List<SimpleGrantedAuthority> roleList = Arrays.stream(claims.get(tokenProvider.TOKEN_CLAIM_NAME, String.class).split(","))
|
||||
.map(SimpleGrantedAuthority::new)
|
||||
.collect(Collectors.toList());
|
||||
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(username, null, roleList));
|
||||
}
|
||||
List<SimpleGrantedAuthority> roleList = Arrays.stream(claims.get(tokenProvider.TOKEN_CLAIM_NAME, String.class).split(","))
|
||||
.map(SimpleGrantedAuthority::new)
|
||||
.collect(Collectors.toList());
|
||||
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(username, null, roleList));
|
||||
}
|
||||
chain.doFilter(request, response);
|
||||
|
||||
} catch (Exception e) {
|
||||
SecurityContextHolder.getContext().setAuthentication(null);
|
||||
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
|
||||
httpServletResponse.setStatus(HttpStatus.UNAUTHORIZED.value());
|
||||
log.error("AuthenticationFilter doFilter", e);
|
||||
chain.doFilter(request, response);
|
||||
}
|
||||
} catch (BusinessException e) {
|
||||
SecurityContextHolder.getContext().setAuthentication(null);
|
||||
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
|
||||
httpServletResponse.setStatus(e.getErrorCode().getStatus());
|
||||
log.error("AuthenticationFilter doFilter error: {}", e.getMessage());
|
||||
} catch (Exception e) {
|
||||
SecurityContextHolder.getContext().setAuthentication(null);
|
||||
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
|
||||
httpServletResponse.setStatus(HttpStatus.UNAUTHORIZED.value());
|
||||
log.error("AuthenticationFilter doFilter error: {}", e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,5 @@
|
||||
package org.egovframe.cloud.userservice.domain.role;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.egovframe.cloud.common.dto.RequestDto;
|
||||
import org.egovframe.cloud.userservice.api.role.dto.AuthorizationListResponseDto;
|
||||
import org.egovframe.cloud.userservice.domain.user.QUser;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageImpl;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
|
||||
import com.google.common.base.CaseFormat;
|
||||
import com.querydsl.core.QueryResults;
|
||||
import com.querydsl.core.types.Order;
|
||||
@@ -20,8 +11,15 @@ import com.querydsl.core.types.dsl.Expressions;
|
||||
import com.querydsl.jpa.JPAExpressions;
|
||||
import com.querydsl.jpa.JPQLQuery;
|
||||
import com.querydsl.jpa.impl.JPAQueryFactory;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.egovframe.cloud.common.dto.RequestDto;
|
||||
import org.egovframe.cloud.userservice.api.role.dto.AuthorizationListResponseDto;
|
||||
import org.egovframe.cloud.userservice.domain.user.QUser;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageImpl;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.userservice.domain.role.AuthorizationRepositoryImpl
|
||||
|
||||
@@ -1,25 +1,18 @@
|
||||
package org.egovframe.cloud.userservice.domain.user;
|
||||
|
||||
import static javax.persistence.GenerationType.IDENTITY;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Arrays;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.EnumType;
|
||||
import javax.persistence.Enumerated;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.egovframe.cloud.common.domain.Role;
|
||||
import org.egovframe.cloud.servlet.domain.BaseEntity;
|
||||
import org.hibernate.annotations.DynamicInsert;
|
||||
import org.hibernate.annotations.DynamicUpdate;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import javax.persistence.*;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static javax.persistence.GenerationType.IDENTITY;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.userservice.domain.user.User
|
||||
@@ -191,36 +184,6 @@ public class User extends BaseEntity {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 구글 id 등록
|
||||
*
|
||||
* @return User 사용자 엔티티
|
||||
*/
|
||||
public User updateGoogleId(String googleId) {
|
||||
this.googleId = googleId;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 카카오 id 등록
|
||||
*
|
||||
* @return User 사용자 엔티티
|
||||
*/
|
||||
public User updateKakaoId(String kakaoId) {
|
||||
this.kakaoId = kakaoId;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 네이버 id 등록
|
||||
*
|
||||
* @return User 사용자 엔티티
|
||||
*/
|
||||
public User updateNaverId(String naverId) {
|
||||
this.naverId = naverId;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 소셜 사용자 여부 반환
|
||||
*
|
||||
@@ -234,6 +197,28 @@ public class User extends BaseEntity {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 소셜 정보 설정
|
||||
*
|
||||
* @return User 사용자 엔티티
|
||||
*/
|
||||
public User setSocial(String provider, String providerId) {
|
||||
switch (provider) {
|
||||
case "google":
|
||||
this.googleId = providerId;
|
||||
break;
|
||||
case "naver":
|
||||
this.naverId = providerId;
|
||||
break;
|
||||
case "kakao":
|
||||
this.kakaoId = providerId;
|
||||
break;
|
||||
default:
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public String getRoleKey() {
|
||||
return this.role.getKey();
|
||||
}
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
package org.egovframe.cloud.userservice.service.role;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.egovframe.cloud.common.config.GlobalConstant;
|
||||
import org.egovframe.cloud.common.dto.RequestDto;
|
||||
import org.egovframe.cloud.common.exception.EntityNotFoundException;
|
||||
@@ -28,7 +24,10 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.AntPathMatcher;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.userservice.service.role.AuthorizationService
|
||||
@@ -50,6 +49,7 @@ import lombok.RequiredArgsConstructor;
|
||||
@Transactional(readOnly = true)
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
@Slf4j
|
||||
public class AuthorizationService extends AbstractService {
|
||||
|
||||
/**
|
||||
|
||||
@@ -12,7 +12,9 @@ import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.egovframe.cloud.common.domain.Role;
|
||||
import org.egovframe.cloud.common.dto.RequestDto;
|
||||
import org.egovframe.cloud.common.exception.BusinessException;
|
||||
import org.egovframe.cloud.common.exception.BusinessMessageException;
|
||||
import org.egovframe.cloud.common.exception.dto.ErrorCode;
|
||||
import org.egovframe.cloud.common.service.AbstractService;
|
||||
import org.egovframe.cloud.common.util.LogUtil;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.*;
|
||||
@@ -21,6 +23,7 @@ import org.egovframe.cloud.userservice.config.dto.SocialUser;
|
||||
import org.egovframe.cloud.userservice.domain.log.LoginLog;
|
||||
import org.egovframe.cloud.userservice.domain.log.LoginLogRepository;
|
||||
import org.egovframe.cloud.userservice.domain.user.*;
|
||||
import org.egovframe.cloud.userservice.api.user.dto.SocialUserResponseDto;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
@@ -315,7 +318,14 @@ public class UserService extends AbstractService implements UserDetailsService {
|
||||
throw new BusinessMessageException(getMessage("msg.join.email.exists"));
|
||||
}
|
||||
|
||||
userRepository.save(requestDto.toEntity(passwordEncoder));
|
||||
User user = requestDto.toEntity(passwordEncoder);
|
||||
|
||||
if (requestDto.getProvider() != null && !"".equals(requestDto.getProvider()) && requestDto.getToken() != null && !"".equals(requestDto.getToken())) {
|
||||
SocialUserResponseDto socialUserResponseDto = getSocialUserInfo(requestDto.getProvider(), requestDto.getToken());
|
||||
user.setSocial(requestDto.getProvider(), socialUserResponseDto.getId());
|
||||
}
|
||||
|
||||
userRepository.save(user);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -364,12 +374,10 @@ public class UserService extends AbstractService implements UserDetailsService {
|
||||
|
||||
log.info("end send change password email - emailAddr: " + emailAddr + ", tokenValue: " + tokenValue);
|
||||
} catch (MessagingException e) {
|
||||
e.printStackTrace();
|
||||
String errorMessage = getMessage("err.user.find.password");
|
||||
log.error(errorMessage + ": " + e.getMessage());
|
||||
throw new BusinessMessageException(errorMessage);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
String errorMessage = getMessage("err.user.find.password");
|
||||
log.error(errorMessage + ": " + e.getMessage());
|
||||
throw new BusinessMessageException(errorMessage);
|
||||
@@ -579,9 +587,9 @@ public class UserService extends AbstractService implements UserDetailsService {
|
||||
*/
|
||||
@Transactional
|
||||
public UserResponseDto loadUserBySocial(UserLoginRequestDto requestDto) {
|
||||
String[] userInfo = getSocialUserInfo(requestDto.getProvider(), requestDto.getToken());
|
||||
/*SocialUserResponseDto socialUserDto = getSocialUserInfo(requestDto.getProvider(), requestDto.getToken());
|
||||
|
||||
UserResponseDto userDto = getAndSaveSocialUser(requestDto.getProvider(), userInfo[0], userInfo[1], userInfo[2]);
|
||||
UserResponseDto userDto = getAndSaveSocialUser(requestDto.getProvider(), socialUserDto);
|
||||
|
||||
if (userDto == null) {
|
||||
throw new BusinessMessageException(getMessage("err.user.join.social"));
|
||||
@@ -590,7 +598,29 @@ public class UserService extends AbstractService implements UserDetailsService {
|
||||
throw new BusinessMessageException(getMessage("err.user.state.cantlogin"));
|
||||
}
|
||||
|
||||
return userDto;
|
||||
return userDto;*/
|
||||
SocialUserResponseDto socialUserResponseDto = getSocialUserInfo(requestDto.getProvider(), requestDto.getToken());
|
||||
|
||||
User user = findSocialUser(requestDto.getProvider(), socialUserResponseDto.getId());
|
||||
|
||||
/*// 이메일이 없는 사용자가 이메일을 직접입력하고 나중에 원래 이메일을 가지고 있는 사용자가 다른 접근할 경우 문제가 생길 수 있음
|
||||
if (user == null && socialUserResponseDto.getEmail() != null) {
|
||||
user = userRepository.findByEmail(socialUserResponseDto.getEmail()).orElse(null);
|
||||
|
||||
// 공급자 id로 조회되지 않지만 이메일로 조회되는 경우 공급자 id 등록
|
||||
if (user != null) {
|
||||
user.setSocial(requestDto.getProvider(), socialUserResponseDto.getId());
|
||||
}
|
||||
}*/
|
||||
|
||||
if (user == null) {
|
||||
throw new BusinessException(ErrorCode.REQUIRE_USER_JOIN);
|
||||
}
|
||||
if (!UserStateCode.NORMAL.getKey().equals(user.getUserStateCode())) {
|
||||
throw new BusinessMessageException(getMessage("err.user.state.cantlogin"));
|
||||
}
|
||||
|
||||
return new UserResponseDto(user);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -601,9 +631,9 @@ public class UserService extends AbstractService implements UserDetailsService {
|
||||
* @return User 사용자 엔티티
|
||||
*/
|
||||
private User findSocialUserByToken(String provider, String token) {
|
||||
String[] userInfo = getSocialUserInfo(provider, token);
|
||||
SocialUserResponseDto socialUserResponseDto = getSocialUserInfo(provider, token);
|
||||
|
||||
return findSocialUser(provider, userInfo[0]);
|
||||
return findSocialUser(provider, socialUserResponseDto.getId());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -613,26 +643,26 @@ public class UserService extends AbstractService implements UserDetailsService {
|
||||
* @param token 토큰
|
||||
* @return String[] 소셜 사용자 정보
|
||||
*/
|
||||
private String[] getSocialUserInfo(String provider, String token) {
|
||||
String[] userInfo = null;
|
||||
public SocialUserResponseDto getSocialUserInfo(String provider, String token) {
|
||||
SocialUserResponseDto social = null;
|
||||
|
||||
switch (provider) {
|
||||
case "google":
|
||||
userInfo = getGoogleUserInfo(token);
|
||||
social = getGoogleUserInfo(token);
|
||||
break;
|
||||
case "naver":
|
||||
userInfo = getNaverUserInfo(token);
|
||||
social = getNaverUserInfo(token);
|
||||
break;
|
||||
case "kakao":
|
||||
userInfo = getKakaoUserInfo(token);
|
||||
social = getKakaoUserInfo(token);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (userInfo == null) throw new BusinessMessageException(getMessage("err.user.social.get"));
|
||||
if (social == null) throw new BusinessMessageException(getMessage("err.user.social.get"));
|
||||
|
||||
return userInfo;
|
||||
return social;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -641,7 +671,7 @@ public class UserService extends AbstractService implements UserDetailsService {
|
||||
* @param token 토큰
|
||||
* @return String[] 구글 사용자 정보
|
||||
*/
|
||||
private String[] getGoogleUserInfo(String token) {
|
||||
private SocialUserResponseDto getGoogleUserInfo(String token) {
|
||||
try {
|
||||
HttpTransport transport = new NetHttpTransport();
|
||||
GsonFactory gsonFactory = new GsonFactory();
|
||||
@@ -652,14 +682,18 @@ public class UserService extends AbstractService implements UserDetailsService {
|
||||
|
||||
GoogleIdToken idToken = verifier.verify(token);
|
||||
|
||||
GoogleIdToken.Payload payload = idToken.getPayload();
|
||||
log.info("google oauth2: {}", payload.toString());
|
||||
if (idToken != null) {
|
||||
GoogleIdToken.Payload payload = idToken.getPayload();
|
||||
log.info("google oauth2: {}", payload.toString());
|
||||
|
||||
return new String[]{
|
||||
payload.getSubject(),
|
||||
payload.getEmail(),
|
||||
(String) payload.get("name")
|
||||
};
|
||||
return SocialUserResponseDto.builder()
|
||||
.id(payload.getSubject())
|
||||
.email(payload.getEmail())
|
||||
.name((String) payload.get("name"))
|
||||
.build();
|
||||
}
|
||||
|
||||
return null;
|
||||
} catch (GeneralSecurityException e) {
|
||||
throw new BusinessMessageException(getMessage("err.user.social.get"));
|
||||
} catch (IOException e) {
|
||||
@@ -675,7 +709,7 @@ public class UserService extends AbstractService implements UserDetailsService {
|
||||
* @param token 토큰
|
||||
* @return String[] 네이버 사용자 정보
|
||||
*/
|
||||
private String[] getNaverUserInfo(String token) {
|
||||
private SocialUserResponseDto getNaverUserInfo(String token) {
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.set("Authorization", "Bearer " + token);
|
||||
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
|
||||
@@ -688,14 +722,26 @@ public class UserService extends AbstractService implements UserDetailsService {
|
||||
if (response.getBody() != null && !"".equals(response.getBody())) {
|
||||
JsonElement element = JsonParser.parseString(response.getBody());
|
||||
JsonObject object = element.getAsJsonObject();
|
||||
log.info("naver oauth2: {}", object.toString());
|
||||
log.info("naver oauth2: {}", object);
|
||||
|
||||
if (object.get("resultcode") != null && "00".equals(object.get("resultcode").getAsString())) {
|
||||
return new String[]{
|
||||
object.get("response").getAsJsonObject().get("id").getAsString(),
|
||||
object.get("response").getAsJsonObject().get("email").getAsString(),
|
||||
object.get("response").getAsJsonObject().get("name").getAsString()
|
||||
};
|
||||
JsonElement responseElement = object.get("response");
|
||||
|
||||
if (responseElement != null) {
|
||||
SocialUserResponseDto.SocialUserResponseDtoBuilder builder = SocialUserResponseDto.builder();
|
||||
|
||||
if (responseElement.getAsJsonObject().get("id") != null && !"".equals(responseElement.getAsJsonObject().get("id").getAsString())) {
|
||||
builder.id(responseElement.getAsJsonObject().get("id").getAsString());
|
||||
}
|
||||
if (responseElement.getAsJsonObject().get("email") != null && !"".equals(responseElement.getAsJsonObject().get("email").getAsString())) {
|
||||
builder.email(responseElement.getAsJsonObject().get("email").getAsString());
|
||||
}
|
||||
if (responseElement.getAsJsonObject().get("name") != null && !"".equals(responseElement.getAsJsonObject().get("name").getAsString())) {
|
||||
builder.name(responseElement.getAsJsonObject().get("name").getAsString());
|
||||
}
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -708,7 +754,7 @@ public class UserService extends AbstractService implements UserDetailsService {
|
||||
* @param token 토큰
|
||||
* @return String[] 카카오 사용자 정보
|
||||
*/
|
||||
private String[] getKakaoUserInfo(String token) {
|
||||
private SocialUserResponseDto getKakaoUserInfo(String token) {
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.set("Authorization", "Bearer " + token);
|
||||
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
|
||||
@@ -721,14 +767,26 @@ public class UserService extends AbstractService implements UserDetailsService {
|
||||
if (response.getBody() != null && !"".equals(response.getBody())) {
|
||||
JsonElement element = JsonParser.parseString(response.getBody());
|
||||
JsonObject object = element.getAsJsonObject();
|
||||
JsonElement kakaoAccount = object.get("kakao_account");
|
||||
log.info("kakao oauth2: {}", object.toString());
|
||||
|
||||
if (object.get("id") != null && !"".equals(object.get("id").getAsString())) {
|
||||
return new String[]{
|
||||
object.get("id").getAsString(),
|
||||
object.get("kakao_account").getAsJsonObject().get("email").getAsString(),
|
||||
object.get("kakao_account").getAsJsonObject().get("profile").getAsJsonObject().get("nickname").getAsString()
|
||||
};
|
||||
String id = object.get("id") != null && !"".equals(object.get("id").getAsString()) ? object.get("id").getAsString() : null;
|
||||
|
||||
if (id != null) {
|
||||
SocialUserResponseDto.SocialUserResponseDtoBuilder builder = SocialUserResponseDto.builder()
|
||||
.id(id);
|
||||
|
||||
if (kakaoAccount.getAsJsonObject().get("email") != null && !"".equals(kakaoAccount.getAsJsonObject().get("email").getAsString())) {
|
||||
builder.email(kakaoAccount.getAsJsonObject().get("email").getAsString());
|
||||
}
|
||||
JsonElement profile = kakaoAccount.getAsJsonObject().get("profile");
|
||||
if (profile != null) {
|
||||
if (profile.getAsJsonObject().get("nickname") != null && !"".equals(profile.getAsJsonObject().get("nickname").getAsString())) {
|
||||
builder.name(profile.getAsJsonObject().get("nickname").getAsString());
|
||||
}
|
||||
}
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -785,19 +843,7 @@ public class UserService extends AbstractService implements UserDetailsService {
|
||||
|
||||
// 공급자 id로 조회되지 않지만 이메일로 조회되는 경우 공급자 id 등록
|
||||
if (user != null) {
|
||||
switch (providerCode) {
|
||||
case "google":
|
||||
user = user.updateGoogleId(providerId);
|
||||
break;
|
||||
case "kakao":
|
||||
user = user.updateKakaoId(providerId);
|
||||
break;
|
||||
case "naver":
|
||||
user = user.updateNaverId(providerId);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
user.setSocial(providerCode, providerId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -806,27 +852,15 @@ public class UserService extends AbstractService implements UserDetailsService {
|
||||
final String userId = UUID.randomUUID().toString();
|
||||
//final String password = makeRandomPassword(); // 임의 비밀번호 생성 시 복호화 불가능
|
||||
|
||||
User.UserBuilder userBuilder = User.builder()
|
||||
user = User.builder()
|
||||
.email(email) // 100byte
|
||||
//.encryptedPassword(passwordEncoder.encode(password)) // 100 byte
|
||||
.userName(userName)
|
||||
.userId(userId)
|
||||
.role(Role.USER)
|
||||
.userStateCode(UserStateCode.NORMAL.getKey());
|
||||
|
||||
switch (providerCode) {
|
||||
case "google":
|
||||
user = userBuilder.googleId(providerId).build();
|
||||
break;
|
||||
case "kakao":
|
||||
user = userBuilder.kakaoId(providerId).build();
|
||||
break;
|
||||
case "naver":
|
||||
user = userBuilder.naverId(providerId).build();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
.userStateCode(UserStateCode.NORMAL.getKey())
|
||||
.build();
|
||||
user.setSocial(providerCode, providerId);
|
||||
|
||||
if (user != null) {
|
||||
userRepository.save(user);
|
||||
|
||||
@@ -1,13 +1,6 @@
|
||||
package org.egovframe.cloud.userservice.api.role;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.egovframe.cloud.userservice.domain.role.Authorization;
|
||||
import org.egovframe.cloud.userservice.domain.role.AuthorizationRepository;
|
||||
import org.egovframe.cloud.userservice.domain.role.RoleAuthorization;
|
||||
@@ -36,7 +29,9 @@ import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
import org.springframework.web.filter.CharacterEncodingFilter;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import java.util.*;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* org.egovframe.cloud.userservice.api.role.AuthorizationApiControllerTest
|
||||
|
||||
Reference in New Issue
Block a user