spring security를 이용해 로그인 시스템 만들기 (2)

spring security에 있는 디폴트 인증 시스템을 사용해도 되지만,

여기서는 로그인 페이지와, 유저 정보를 담는 클래스, 인증 담당자를 입맛대로 변경해 보겠다.

그전에 기본 설정을 해야 한다.

기본 설정하러 가기

기본 설정이 완료되었다면, 커스터마이징을 위한 security-context.xml 설정을 해보자.

security-context.xml

1) 로그인 페이지 바꾸기

<form-login>

login-page 

 로그인 페이지 주소를 지정

 username-parameter

 로그인 페이지 form에 있는 username을 저장한 변수이름 지정

 password-parameter

 로그인 페이지 form에 있는 password을 저장한 변수이름 지정 

 login-processing-url

 로그인 페이지 form action에 입력할 주소 지정

 default-target-url

 로그인 성공인 경우 호출할 주소 지정

 authentication-failure-url

 로그인 실패인 경우 호출할 주소 지정

 always-use-default-target

 


2) 중복 로그인 설정

<concurrency-control>

max-sessions 

 중복 로그인 가능한 세션 수

 1로 지정해야, 중복 로그인을 방지할 수 있다.

 expired-url

 중복 로그인이 발생하면, 먼저 로그인한 세션이 끊어지게 되며,

 세션이 끊어진 상태에서, 모든 url을 호출할 경우, 끊어진 원인을 알려줄 주소를 지정


3) 인증을 제공할 프로바이더 변경


 ref

 내가 만든 프로바이더 지정



유저 정보 클래스

이메일, 전화번호 등의 유저 정보를 추가해 사용한다.

인증 프로바이더 담당자

AuthenticationProvider 인터페이스를 구현하고,

authenticate 메소드에서 인증을 시켜주면 된다.

인증이 성공한다면, 위에서 정의한 유저 정보 클래스를 생성하여 주입시킨다.


JSP 페이지

login_success.jsp

login.jsp

간단하게 아이디와 비번을 FORM 형태로 입력받아 POST형식으로 전달하도록 구현했다.

사용한 이름들은 security-context.xml의 form-login에 지정한 이름과 일치해야 한다.


logout.jsp

login_duplicate.jsp

테스트 할 컨트롤러 소스

로그인 하지 않은 상태로 접근하면, 로그인 페이지가 호출되어야 하며,

로그인이 성공하였더라도 ROLE_USER 역할을 가진 유저만, 페이지에 접근 할 수 있어야 한다.

또한, 중복로그인이 발생하면 먼저 로그인한 세션이 끊어져야 한다.

인증이 완료된 유저 정보를 얻어올 때에는 아래 코드를 사용한다.

CustomUserDetails userDetails = (CustomUserDetails)SecurityContextHolder.getContext().getAuthentication().getDetails();

테스트 결과 

로그인 성공



로그인 이후, 페이지 접근



로그아웃



로그인 중복



프로젝트 코드 확인하러 가기