
네이버 아이디 구현 과정에서 필요한 서비스 로직
유저 식별자를 통해, userdetails 생성
@Service
@RequiredArgsConstructor
@Slf4j
public class CustomUserDetailsService implements UserDetailsService {
private final MemberRepository memberRepository;
@Transactional(readOnly = true)
@Override
public UserDetails loadUserByUsername(String memberId) throws UsernameNotFoundException {
return memberRepository.findById(memberId)
.map(this::createUserDetails)
.orElseThrow(() -> new UsernameNotFoundException("해당 유저를 찾을 수 없습니다."));
}
private UserDetails createUserDetails (Member member) {
if (member.getAuthProvider() != null) {
return new User (member.getId(), "", member.getAuthorities());
} else {
return new User (member.getId(), member.getPassword(), member.getAuthorities());
}
}
}
각 서비스에 맞는 로직을 넣을 것. 회원가입 및 로그인 시에 필요한 것들
@RequiredArgsConstructor
@Service
@Slf4j
public class CustomOAuth2UserService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> {
private final MemberRepository memberRepository;
private final MyCostumeRepository myCostumeRepository;
@Override
public OAuth2User loadUser(OAuth2UserRequest oAuth2UserRequest) throws OAuth2AuthenticationException {
OAuth2UserService<OAuth2UserRequest, OAuth2User> oAuth2UserService = new DefaultOAuth2UserService();
OAuth2User oAuth2User = oAuth2UserService.loadUser(oAuth2UserRequest);
return processOAuth2User(oAuth2UserRequest, oAuth2User);
}
protected OAuth2User processOAuth2User(OAuth2UserRequest oAuth2UserRequest, OAuth2User oAuth2User) {
//OAuth2 로그인 플랫폼 구분
AuthProvider authProvider = AuthProvider.valueOf(oAuth2UserRequest.getClientRegistration().getRegistrationId().toUpperCase());
OAuth2UserInfo oAuth2UserInfo = OAuth2UserInfoFactory.getOAuth2UserInfo(authProvider, oAuth2User.getAttributes());
if (!StringUtils.hasText(oAuth2UserInfo.getEmail())) {
throw new RuntimeException("Email not found from OAuth2 provider");
}
Member member = memberRepository.findById(oAuth2UserInfo.getOAuth2Id()).orElse(null);
//이미 가입된 경우
if (member != null) {
member = updateUser(member, oAuth2UserInfo);
}
//가입되지 않은 경우
else {
member = registerUser(authProvider, oAuth2UserInfo);
}
return UserPrincipal.create(member, oAuth2UserInfo.getAttributes());
}
private Member registerUser(AuthProvider authProvider, OAuth2UserInfo oAuth2UserInfo) {
Member tmp = memberRepository.findByNicknameAndIsDeleted(oAuth2UserInfo.getNickname(), false).orElse(null);
String nickname = oAuth2UserInfo.getNickname();
if (tmp != null) {
nickname = UUID.randomUUID().toString();
}
Member member = Member.builder()
.email(oAuth2UserInfo.getEmail())
.password(null)
.level(1)
.crystal(20)
.isEmailVerified(true)
.nickname(nickname)
.id(oAuth2UserInfo.getOAuth2Id())
.authProvider(authProvider)
.role(Role.ROLE_USER)
.build();
member = memberRepository.save(member);
MyCostume myCostume = myCostumeRepository.save(
MyCostume.builder().
costumeSeq(1L).
member(member).
costumeGrade("normal").
costumeName("man_actionhero").
costumeImage("man_actionhero").
build());
member.setMyCostume(myCostume, member);
memberRepository.save(member);
return member;
}
private Member updateUser(Member member, OAuth2UserInfo oAuth2UserInfo) {
return member.update(oAuth2UserInfo);
}
}