Security 를 쓰려면 Security를 쓰겠습니다~ 하고 추가를 해줘야한다.
따라서 아래 세 줄 코드들을 build.gradle에서 추가해주었다.
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
testImplementation 'org.springframework.security:spring-security-test'
위 세 코드를 추가하고, 프로젝트를 gradle - > refresh 하면
localhost8081 만들어와도 이렇게 로그인 창이 뜨게 된다.
security 패키지와 FailureHandler, SecurityConfig, UserDetailsServiceImpl 을
이전 board 프로젝트에서 한 것을 복붙해왔고,
SecurityConfig
Security를 보면 Bean객체로 PasswordEncoder 클래스를 하나 만들어 놓은게 있다. 얘는 암호화 시켜주는 클래스다.
header.js
MemberController 컨트롤러
MemberController로 돌아와서 Autowried로 SecurityConfig에서 생성했던 클래스를 받아와준 후,
회원가입 컨트롤러에 MemPw를 암호화 해준 후 MemberVO의 MemPw에 암호화된 비밀번호를 넣어준다.
SecurityConfig
회원가입 을 눌렀을 때, 누구나 접근이 가능해야 하기 때문에, /member/join 도 추가해주었다.
join을 눌러 회원가입을 하면 이렇게 정상적으로 콘솔창에 데이터들이 나오며 실행되는 것을 확인할 수 있다.
콘솔에 Password 창에는 보다시피 암호화가 걸려있는 것을 확인할 수 있다.
또, 암호화가 안된 데이터들은 더 이상 로그인이 되지 않을 것이다.
그래서 암호화 안된 비밀번호 데이터들은 모두 지울 것이다. 지우려고하면
ORA-02292: 무결성 제약조건(SHOP_MANAGER.BUY_MEMBER_FK)이 위배되었습니다- 자식 레코드가 발견되었습니다
하면서 안지워진다. 그래서 관리자 계정을 하나 더 생성해주었다.
이후 UPDATE SHOP_MEMBER SET MEM_ROLE ='ADMIN' WHERE MEM_ID ='admin1';
을하여 관리자 계정의 권한도 ADMIN으로 주게 되었다.
현재 상세보기를 누르면 권한이 없다는 페이지가 뜨는데,
MemberController 컨트롤러
MemberController에서 인증 실패시 이동되는 html을 하나 만들어주었다.
SecurityConfig
인증 실패했을때도 와야하므로 requestMatchers에도 추가해주었다.
login.html
member에 login.html을 만들고, header.html에 있는 로그인 폼 html을 긁어왔다.
justify-content-center을 쓰면 이 안에 있는 div는 모두 가운데로 온다.
이제 눌러주면 이렇게 로그인 화면으로 오게 된다.
InterceptorConfig
interceptor에서 member/loginForm에도 이렇게 추가해주면, 위 카테고리 데이터도 가지고와서 뜰 수 있게 해준다.
header.js , SecurityConfig
로그인 함수가 실행되면 실제로 가는 경로가 ajax에서 /member/login이다.
ajax에서 경로로 가게 되면 security에서 실행될 것이다.
MemberController
얘는 이제 필요가 없다. 지워주자.
member-mapper.xml
security는 데이터를 가져갈 때 id 하나만 있어도 무방하므로,
member-mapper에서 로그인 id 하나만 가지고 쿼리를 실행해줄 거다.
MemberService
로그인 쿼리를 실행할 때 MemberVO 대신 String으로 해서 memId를 하나 가지고 가준다.
MemberServiceImpl
마찬가지로 MemberServiceImpl에서도 memId 하나만 매개변수로 설정해준다.
UserDetailsServiceImpl
MemberVO를 재 정의 해주고, 각 로그인 정보를 UserDetails 객체에 넣어주었다.
그리고 login쿼리에 username 데이터를 넣었다.
header.js
로그인은 ajax 경로로 넘어오게 된다.
로그인을 누르면 이렇게 알람 창으로 111이 뜬다.
SecurityConfig
로그인 성공하면 이전 페이지로 가는데, 이전 페이지가 없으면 최초의 경로 "/"로 가게 된다.
다만, ajax로 넘어오니까 일을 두번 처리하게 된다. defaultSuccessUrl("/member/loginResult", true)로 가려고하고,
ajax끝나면 scuess 실행되니까 /member/login 으로도 가려고 한다.
실패했을때를 위해 컨트롤을 만들어 준다.
로그인 하고나면 자동으로defaultSuccessUrl("/member/loginResult", true) 로 가는데,
failureUrl 대신에 어떤 메소드 실행할게요. failureHandler
SecurityConfig
이전 페이지가 없을 때, defaultSuccessUrl("/member/loginResult", true)
FaulureHandler
failureHandler가 어떻게 만들어 졌는지 확인해보았다.
얘는 SimpleUrlAuthenticationFailureHandler을 상속받아서 그 클래스 안에 있는 메소드를 Overrindg해서 만들었다.
그럼 SuccessHandler도 똑같이 한번 만들어줘보자.
SuccessHandler
SuccessHandler를 하나 만들고, FailurHandler처럼 핸들러를 extends 해주자.
이후 overriding 하여 메소드를 하나 호출해준다.
SuccessHandler에서 만약 핸들러가 실행되면 이렇게 콘솔창에 나타낼 수 있게 찍어보았다.
SecurityConfig
SecurityConfig에서 콘솔에 찍을 객체를 생성후 return 시켜주었다.
로그인 성공시 sucess 핸들러 실행이 콘솔창에 뜬다.
SuccessHandler
로그인 성공 핸들러에서 sucess라는 문자를 p에 담아주었다.
로그인 성공시 header.js에 있는 alert(result) 값으로 이렇게 success가 뜨게 된다.
header.js
따라서, result 값이 'success'이면 "/" 페이지로 가도록 하였다.
로그인을 실패해보자.
SecurityConfig
로그인 실패시 경로도 추가해주었다.
FailurHandler
로그인 실패시 확인하기 위해 위 코드를 삭제한 후, SuccessHandler에서 사용했던걸 가져와줬다.
header.js
로그인을 실패하면 위와 같이 로그인 정보를 입력해주세요 를 출력한다.
header.html
header.html에서 loginErrorDiv id를 생성해주었다. js에서 어떤 기능을 통해 추가하기 위함이다.
header.js
이렇게 로그인 실패를 하면, 위 html에서 만든 id에서 위 str을 추가하는 코드를 짰다.
로그인 정보가 틀리면, 이렇게 로그인 정보를 확인하세요. 라는 문구가 뜨게된다.
header.js
init() 함수에서 로그인 실패 후 폼이 닫힐 때 마다 실패 문구를 지워주며 마무리할 수 있다.
IndexController 컨트롤러
HttpSession은 이제 더이상 필요가 없다. 지워주자.
authentication.getAuthorities 얘도 Collection < ? extends E > 이므로, ArrayList를 생성할때 위와 같은 자료형을 선택해준다.
로그인한 사람의 권한 정보를 담은 List를 생성 후 변수를 담아준다.
삭제
AuthoInter 머시기와 InterceptorConfig 에서 Ajax가 실행되는 메소드에 인터셉터를 제외하는 구문은 삭제한다.
IndexController 컨트롤러
이후 다시 indexController에서 로그인 안됬을 때와 로그인 한 사람의 정보를 담아서 경로를 정의해줄 수 있다.
관리자로 로그인해서 들어오면 바로 admin/cateManage 로 들어오게 된다.
하지만 사용자 id로 들어오면 다시 아이템 리스트 목록 화면으로 오게 된다.
다음 포스팅에서는 로그인 했을때 표시를 해보도록 하자.
'✨ Back-end > Spring-Boot' 카테고리의 다른 글
[Spring] 쇼핑몰 - 53 관리자 계정 주문 관리 조회 (0) | 2023.04.25 |
---|---|
[Spring] 쇼핑몰 - 52 Security 사용해 로그인하기 -2 (0) | 2023.04.25 |
[Spring] 보드게시판 만들기(11) Security 사용해 로그인하기 (0) | 2023.04.21 |
[Spring] Security 보안(인증과 권한, 인가) 로그인 방법 (0) | 2023.04.19 |
[Spring] 쇼핑몰 - 50 마지막 에러 잡기 (0) | 2023.04.19 |
댓글