Java Spring Boot 007-3 | Login 커스텀

Yunny.Log ·2022년 3월 14일
0

Spring Boot

목록 보기
36/80
post-thumbnail

Login 커스텀

설명출처 : https://to-dy.tistory.com/86

UserDetailsService VS UserDetails
(1) UserDetails

  • 사용자의 정보를 모두 담아두는 클래스, 사용자의 정보를 담을 객체
  • 위의 메소드들에서 내가 사용할 것만 커스터마이즈

(2) UserDetailsService

  • DB에서 유저 정보를 직접 가져오는 인터페이스
  • loadUserByUsername() 메소드 : DB에서 유저 정보를 불러오는 중요한 메소드
public class CustomUserDetailsService implements UserDetailsService {
    
    @Autowired
    private UserAuthDAO userAuthDAO;
 
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        CustomUserDetails user = userAuthDAO.getUserById(username);
        if(user==null) {
            throw new UsernameNotFoundException(username);
        }
        return user;
    }
 
}

passwordEncoder 추가


@Configuration
public class PasswordEncoderConfig {
    @Bean
    public PasswordEncoder passwordEncoder(){
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }
}
  • 패스워드를 받아서 평문 패스워드를 적절히 encode 해준다
  • 암호화된 패스워드 - 평문 패스워드 는 다르지만, 암호화하면 같은 패스워드
  • 로그인, 회원가입 시 패스워드를 꼭 encode해서 저장하는 과정 필수
(!passwordEncoder.matches(password, loginUser.getPassword()))

같은 코드로 지금 입력된 비밀번호와, 로그인한 유저의 비밀번호와 같은 지 유무 파악해서 적절한 비번 넣었는지 알기 가능

UserEntity 추가


@Entity
@Table(name = "USER_ENTITY")
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(unique = true)
    private String username;

    @Column
    private String password;

    @Column
    private String nickname;

    @Column
    private String role;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }
}

UserDetailsService 만들어보기


@Service
public class CustomUserDetailsService implements UserDetailsService {
    private static final Logger logger = LoggerFactory.getLogger(CustomUserDetailsService.class);
    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;

    public CustomUserDetailsService(
            @Autowired UserRepository userRepository,
            @Autowired PasswordEncoder passwordEncoder
    ) {
        this.userRepository = userRepository;
        this.passwordEncoder = passwordEncoder;
        final UserEntity testUserEntity = new UserEntity();
        testUserEntity.setUsername("entity_user");
        testUserEntity.setPassword(passwordEncoder.encode("test1pass"));
        this.userRepository.save(testUserEntity);
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        final UserEntity userEntity = userRepository.findByUsername(username);
        return new User(username, userEntity.getPassword(), new ArrayList<>());
    }
}
  • 유저 디테일 서비스를 이용해서 유저 정보들을 가져오기
  • 이때의 서비스를 활용해서 UserDetail

UserDetails 정의하고 사용하기

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        final UserEntity userEntity = userRepository.findByUsername(username);
        return new User(username, userEntity.getPassword(), new ArrayList<>());
    }
  • loadbyuser : 사용자를 데려오는 메소드라고 할 수 있지

0개의 댓글