이번 강의에서는
저희가 자체적으로 제작한 AuthenticationProvider를
실행해보도록 하겠습니다
실행해보기 전에 새로운 섹션에 도입하게 되는 것이기 때문에
이전 섹션의 프로젝트에 새로운 프로젝트를
생성시켜야 합니다
그렇게 하기 위해서 제가 지금부터 무엇을 하고자 하느냐면
이 프로젝트 즉 springsecsection4를
복사하고 붙여넣기 한 후에
폴더명을 springsecsection5로 바꿀 것입니다
이렇게 했다면
pom.xml에 들어가
이 pom.xml 속 세부 사항들을 변경할 수 있습니다
pom.xml을 클릭해서 보면
이 값을 4에서 5로 바꾸고 싶기 때문에
artifactID와 이름에 모두 변경 사항을 적용해줍니다
이 정도만 수정한다면 괜찮은 상태일 것입니다
이 프로젝트를 IntelliJ IDEA로 불러오기 전에
target 폴더 안에 있는 컴파일 클래스를
삭제할 수 있습니다
일단 삭제를 해보겠습니다
이후에 IntelliJ ID로 이동합니다
일단 먼저 제가 가지고 있는 클래스들을 모두 종료시키겠습니다
이제 제가 방금 생성한 새로운 Maven 프로젝트를
불러오도록 하겠습니다
불러오려면 File → New를 선택하고
Module From Existing Sources에서 pom.xml를 선택합니다
springsecsection5 프로젝트 안에 있는 걸 볼 수 있습니다
저도 똑같이 해보겠습니다
이 Open 버튼을 누르면
새로운 프로젝트를 불러왔다는 것을 알 수 있습니다
이제부터 몇 가지 것들을 해야 합니다
먼저 Maven에 가서 Reload All Maven Project를
실행 시켜야 합니다
이를 통해 새로운 Maven 프로젝트에 필요한
dependencies를 모두 다운로드할 수 있습니다
여기를 보시면
새 프로젝트인 springsecsection5의 dependencies을
해결하려고 시도하고 있습니다
그리고 Maven dependencies를 다운로드하는 중입니다
몇 분 정도 시간이 걸릴 것입니다
일단 기다려봅시다
이제 모든 Maven dependencies가 성공적으로 다운로드되었습니다
제가 진행할 수 있는 다음 단계는
springsecsection5를 마우스 오른쪽 버튼으로 클릭하고
Build Module 혹은 Rebuild Module option을 선택하는 것입니다
따라서 이 Build Module option을 선택할 것입니다
이제 제 Maven이 다운로드한 모든 dependencies들과
현재의 프로젝트를 컴파일 해줄 것입니다
컴파일 작업이 성공적으로 진행되어서
컴파일 문제가 없습니다
이제 Java 패키지로 간 후 이 config 패키지에서
새로운 Java 클래스를 생성할 것 입니다
제가 정한 클래스 명칭은
EasyBankUsernamePasswordAuthenticationProvider입니다
클래스명을 지정했으니
인터페이스를 실행하고 있는지 확인해야 합니다
그래서 implements를 쓰고
인터페이스 이름이 무엇인지 적는 중입니다
아시다시피 인터페이스 이름은
AuthenticationProvider입니다
실행시키는 걸 마치면
두 메소드를 오버라이드 해야 합니다
따라서 두 메소드를 모두 실행해보겠습니다
'메소드 실행하기'를 눌러보겠습니다
Java docs를 복사하고 싶지 않고
오버라이드 하고 싶습니다
여기서 보실 수 있듯이
두 메소드 모두 실행되고 있지만
로직이 존재하지 않습니다
제가 바꾸고 싶은 첫 번째 부분은
supports 메소드 내에 있습니다
Spring Security 프레임워크에 전달하고 싶었던 사항은
인증에 대한 유저 이름, 비밀번호 스타일 등을
서포트하고 싶다는 점입니다
따라서 제가 할 수 있는 것은
DaoAuthenticationProvide로 이동하여
새로운 AuthenticationProvider에 코드 전체를 복사하기 위해
메소드 서포트를 찾아보는 것입니다
새로운 AuthenticationProvider안에
코드를 붙여넣고 있습니다
이 과정을 거쳤기 때문에
서포트 메소드 관점에서는 잘못된 것이 없을 것입니다
이제 authenticate 메소드에서
저장 시스템에서부터 유저 세부사항을 로딩하고
비밀번호를 비교하는 것까지
모든 authentication 로직을
정확하게 정의하는 것이 우리의 책임입니다
이 이후에
authentication의 성공 여부에 대한
정보가 담겨있는 성공적인 authentication 객체를
생성해야 합니다
이렇게 하기 위해서는
authentication 내에서 해야만 하는
가장 첫 번째 단계가 있습니다
데이터 베이스에서부터 유저 세부 사항을 불러와야 합니다
그리고 유저 세부 사항을 데이터 베이스로부터
가져오고 나서 해야 하는 두 번째 단계는
비밀번호를 비교하는 것입니다
위의 두 단계를 하기 위해서는 이 클래스에
오토와이어 되어있어야 하기에 Beans가 필요합니다
이 Beans들은 고객 저장소같은 것이며 이를 통해
데이터 베이스에서 유저 디테일을 불러올 수 있습니다
그리고 주입하고자 하는 두 번째 Bean은
PasswordEncorder입니다
지금으로선 우리가 사용하고 있는 PasswordEncorder는
BCryptPasswordEncoder입니다
오토와이어되고 주입된 두 Beans를 이용하여
authentication 로직을 시작할 수 있습니다
제가 지금부터 할 것은
더 세부적으로 이야기를 나눌 수 있도록
여기 있는 코드들을 복사할 것입니다
지금 똑같이 복사하고 있습니다
제가 필요한 모든 클래스들을 불러오도록 하겠습니다
이제 다 완료되었습니다
컴파일 과정에도 문제가 없습니다
처음 두 줄은 이해하기 쉽습니다
유저 이름과 비밀번호를 불러오는 중입니다
엔드 유저가 이 유저 이름과 비밀번호 변수를 지정하였고
이 상황에서는 유저 이름이
이메일이기 때문에
findByEmail 메소드를 사용하여
유저 세부 사항을 파악하고 있습니다
이 고객 대상이 있다면
데이터 베이스로부터의 기록을
성공적으로 불러 왔는지 확인할 것입니다
대상이 없다면 그저
BadCredentialsException을 실행시키는 것입니다
그렇지 않고 주어진 이메일에
데이터베이스로부터 불러온 기록이 있다면 여기 보시다시피
엔드 유저가 입력한 비밀번호가
데이터 베이스 내의 비밀번호와 일치하는지
확인할 수 있습니다
이런 이유로 passwordEncoder.matches 메소드를 사용합니다
이 matches 메소드에서 새 비밀번호를 제공합니다
이 비밀번호를 엔드 유저에 의해 입력되며
# 비밀번호를 데이터 베이스 내에 있습니다
만약 비밀번호가 일치한다면
이 'if' 블록으로 들어갈 것입니다
일치하지 않는다면 BadCredentialsException이 실행될 것입니다
이 'if' 루프 내에
엔드 유저의 authorities 세부 사항을
덧붙이려는 모습을 볼 수 있습니다
따라서 authorities 세부 사항은
customer 테이블 내의 role 컬럼에 존재합니다
Role 문자열 값을 SimpleGrantedAuthority 클래스로
변환하려고 하는 것입니다
그리고 동일하게 authorities 리스트로 추가할 것입니다
보다시피 UsernamePasswordAuthenticationToken 대상을
새롭게 생성하고 있습니다
이 생성자를 보면
이 유저 이름, credentials 그리고 authorities를
authentication 객체에 설정하고 있습니다
하지만 동시에 authentication이
성공적이라고 명시되어있습니다
이 생성자와 한 줄의 코드를 보면
ProviderManager에게
authentication이 성공적으로 이루어졌다고 알립니다
이 생성자 내에서 이와 같은 상황이 벌어지고 있는 것입니다
이 부분에서는 AuthenticationProvider 속을 볼 수 있습니다
써져있는 바로는
모든 authentication 로직을 작성했고
예를 들면 유저 세부사항 불러오기나 비밀번호 비교하기 등
모든 정보를 모아서
UsernamePasswordAuthenticationToken으로 넣었습니다
그리고 ProviderManager에게도 동일한 정보를 주었습니다
그리고 유저의 연령 세부 정보
국가 세부 정보를 확인하고
그에 기반하여
인증을 허용하거나 거부하려는 경우
이 authenticate 메소드 내에
원하는 종류의 authentication 로직을
작성할 수 있습니다
이제 이전에 우리가 EasyBankUserDetails에
작성했던 로직들과
비교해보았을 때
여기서 우리는 유저 세부 사항들을
데이터 베이스로부터 불러와서
유저 세부 정보 객체로 변환하기 위해
유저의 이 생성자를 사용하고 있습니다
그래서 이 유저 세부 정보 객체가
DaoAuthenticationProvider에서 사용될 것입니다
그리고 나중에는 DaoAuthenticationProvider가
비밀번호를 비교해볼 것이고
모든 것이 성공적이라면
authentication에 대한 객체를 생성할 것입니다
이것이 우리가 AuthenticationProvider 내부에서
지금까지 진행했던 바입니다
이 코드와 함께
AuthenticationProvider는 Spring Security 프레임워크에
감지되지 않을 것입니다
이 클래스를 bean으로 생성하지 않았기 때문입니다
동일하게 @Component 주석(어노테이션)을
이 클래스 위에 작성해야 합니다
이제 모든 변화들이 완벽하게 적용되었을 것입니다
다음 강의에서 우리가 할 수 있는 것은
애플리케이션에 로그인을 하여
인증이 우리가 적용한 변화에 맞춰
정상적으로 작동되고 있는지 보는 것 입니다
감사드리며 다음 강의에서 뵙겠습니다
수고하셨습니다