IT모아

스프링 시큐리티 JDBC 를 이용한 로그인(1) 본문

Spring(스프링)/시큐리티

스프링 시큐리티 JDBC 를 이용한 로그인(1)

아롱사태남 2015.10.04 20:34

우선 예제를 시작하기 앞서 동작 원리 및 개념을 알고 진행을 합시다 ㅎㅎ



DB 기반 인증의 동작 원리





UserDetails 란 회원의 정보(이름, 이메일 등) 주체의 프로필을 저장하는데 사용됩니다.

위 사진에서 UserDetails를 반환 시켜주는 클래스 및 인터페이스로는 JdbcDaoImpl UserDetailService가 있는데요 . JdbcDaoImpl 클래스가 UserDetailsService의 구현체를 제공하게 되어 UserDetailsService에서 UserDetails를 반환 시켜주게 됩니다. 


JdbcDaoImpl -> UserDetailsService -> UserDetails  라고 생각하시면 이해하시기 편할꺼라고 생각합니다 하하하하...


자 그럼 이제 예제를 보고 따라해보시기 바랍니다.


개발 환경

1. Eclipse -> Luna Service Release 2 (4.4.2)

2. Spring 3.2.5 RELEASE

3. JDK 1.6

4. TOMCAT 7

5. Spring JDBC 3.2.5.RELEASE

6. Spring Security 3.2.5 RELEASE

7. MySQL WorkBench


이클립스 안습이죠ㅎㅎ 노트북으로 포스팅을 하다보니... 업데이트를 안한 Lazy한 개발자네요

시큐리티를 사용하기 위해서 pom.xml 에 Dependency를 추가해보도록 합시다.

Dependency를 추가 하셨다면 시큐리티를 사용하기 위해 xml 파일을 만들어서 설정 작업을 해야겠죠ㅎㅎ?



WEB-INF -> spring -> appServlet 우 클릭 -> New -> Spring Bean Configuration File

에서 security-context.xml 라는 파일을 생성 !!! 

참 친절히도 경로까지 다 적어주죠?ㅋㅋㅋ

생성한 파일에서 namespace에 시큐리티 라는 체크박스를 클릭하여 셋팅 해주세요~~


혹시 시큐리티가 없다면 pom.xml에서 빠진 Dependency가 있는지 확인해보세요!

추가적으로 방금만든 security-context.xml를 사용하기 위해서는 몇가지 추가 설정을 더 해주어야 합니다 . 

web.xml 을 오픈하셔서 우리가 방금 만든 securty-context.xml을 사용하기 위해 


security-context.xml이 위치해 있는 경로를 작성~~

자 마지막으로 필터 설정만 하면 끝~~


DelegatingFilterProxy 는 스프링 기반의 웹 어플리케이션 에서 서블릿 라이플 사이클과 연계해 스프링 빈 의존성을 서블릿 필터에 바인딩 하는 역할을 합니다. 


여기까지 이상없이 진행하셨다면 하이라이트인 JDBC 설정 을 보도록 하죠!!


root-context.xml

에 빈 설정을 통하여 해당 MySql에 컨넥션을 맺어주기만 하면 됩니다 참 쉽죠잉?

앗.. 실수로 빼먹었네요... 빈 설정 시 DriverManagerDataSource를 못찾는다는 에러가 발생할 겁니다.

왜 그런지 짐작하시는 분들도 대다수 일꺼 같네요 ㅎㅎ

참 잘 만들었다고 생각하는 우리 Maven 형님을 통해 바인딩 시켜줍시다!

하나더 mysql connector도 추가추가!



항상 lib에 jar를 구글링하여 다운받아서 넣었던게 엊그제 같은데..날로만 늘어가는 기술로 인해 정말 편해지고 있네요ㅎㅎ

이제 jdbc를 사용하기 위해서는 다시 한번 security-context.xml에서 security를 설정해줬던거 처럼

jdbc를 namespace에서 추가만 한다면 설정은 이제 끄읏!!



휴우 !!ㅋㅋㅋ


이제 DB에 있는 데이터를 조회하여 로그인 을 시켜보도록 하죠!!




처음부터 꿀을 먹을려고 하시면 아니되옵니다 . auto-config ="true"로 지정하면 엄청남 혜택을 받게되는데요 auto-config가 우리 몰래 해주는 역할은 

1. Http basic Authentication

2. Form login authentication

3. Logout 

인데요 여기서 설명할 것은 2.번인데요 auto-config가 저도 여러분도 로그인 ui를 만들지 않아도  기본적으로 제공을 해주게 됩니다.  그런데 이 ui 화면을 갖고 서비스를 하기에는 무리가 있죠?

<security:form-login> 엘리먼트를 통해 입맞에 맞게 ui를 만들어 보세요 ㅎㅎ

여기서 HTML 및 디자인을 배울게 아니므로 간단하게 아래 첨부 사진처럼 만들었습니다..




UI가 마치 웹 초창기 모습을 보는듯 하네요ㅋㅋㅋㅋ(솔직히 더 이상한듯하네요 )

여기서 알고 넘어가야할 사항이 두가지 가 있습니다.

우리가 설정을 달리 주었기 때문에 ID & PW 의 name 명을 각각 user_id 그리고 pass_wd로 지어주었는데요. 

기본적으로 j_username 과 j_password 라는 폼 필드명과 j_spring_security_check 라는 폼 서브밋 URL은 UsernamePasswordAuthenticationFilter가 디폴트로 지정한 이름입니다.

또한 폼 태그에 있는 method 는 항상 "POST" 형식으로 값을 보내줘야 한다는걸 잊지마세요!!

POST가 아닌 GET을 사용하면 UsernamePasswordAuthenticationFilter  에 의해 로그인 요청이 거절 당합니다.

여기서 모든걸 설명하기에는 분량이 너무 많은 관계로 Pass할께요....

(시큐리티 에서는 클라이언트의 요청을 전 처리 후 처리가 가능합니다)


우리가 할려던건 auto-config가 기본적으로 제공하는 기능으로 로그인을 할려는게 아니라 JDBC를 이용한 로그인 이기때문에 다음 처럼 DB 구성을 들어가보도록 하죠 ㅎㅎ 




(※참고 :http://www.mkyong.com/spring-security/spring-security-form-login-using-database/)


위에서 user_roles 라는 테이블에 있는 role 컬럼에 ROLE_USER 데이터를 넣은 이유는 

마지막 단계(필터)인 FilterIntercepte 때문인데요 해당 요청을 수락 할지 결정하는데 있어서 접근하고자 설정한 것이 hasRole('ROLE_USER')이기때문에 

쿼리에서 ROLE_USER 데이터를 추출해야 합니다. 

여기서 추가적으로 알고 넘어가야 하는게 있다면


1) AcessDecisionManager 는 인증을 처리하는 역할

2) AcessDecisionManager 가 지원해주는 메서드중 하나인 decide 

    는 컨텍스트 및 보안설정을 참조하여 접근여부를 결정

3) Votor 는 사용자의 리소스를 참조하여 접근허가를 결정


이 세가지가 있습니다. 더 자사한 내용을 알고 싶다면 추가적으로 공부를 해보시는것도 괜찮겠네요 ㅎㅎ 

자 이제 결과를 보도록 하죠!!

DB에 들어가 있는 아이디와 비밀번호를 입력 후 로그인을 해보면


키야아 !! 끄읏 ㅋㅋㅋ

7 Comments
댓글쓰기 폼