spring security 설정 (7) - service

진병욱·2024년 3월 28일
post-thumbnail

네이버 아이디 구현 과정에서 필요한 서비스 로직

유저 정보 불러오기

CustomUserDetailsService.java

유저 식별자를 통해, 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());
        }
    }

}

OAuth2 로그인 시의 로직

CustomOAuth2UserService.java

각 서비스에 맞는 로직을 넣을 것. 회원가입 및 로그인 시에 필요한 것들

@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);
    }
}
profile
새로운 기술을 접하는 것에 망설임이 없고, 부족한 것이 있다면 항상 배우고자 하는 열정을 가지고 있습니다!

0개의 댓글