공부/Spring
인증2. DB연동 후 알아서 권한 확인해주는 편한 Spring
Egomi
2017. 4. 10. 12:40
기존에 DB 연동 글을 썼으나 너무 조잡해 정리하는 글을 다시 작성한다.
로그인 검사를 위해선 다음과 같은 과정이 필요하다.
1. A 페이지 접근
2. 권한 확인
3-1. 권한 없는 경우, 로그인페이지 이동
3-2. 권한 있는 경우, A페이지 이동
4. 3-1 후, 로그인 정보를 입력받는다.
5. 로그인 정보 == DB 정보 확인
6. 로그인 완료
이 모든 과정들은 디스패처 서블릿의 Security 부분에서 담당하게 된다.
@Security-Context.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <http use-expressions="true"> <!-- 로그인 창을 알아서 마련하려면 auto-config="true"하면 자동 생성 --> <!-- 마이페이지는 인증 정보에따라 페이지를 분배해주는 라우터 역할 --> <form-login login-page="/joinus/login" default-target-url="/joinus/mypage" always-use-default-target="true"/> <logout logout-success-url="/index"/> <!-- 로그아웃 후 이동할 경로 --> <intercept-url pattern="/customer/notice-detail" access="hasRole('ROLE_USER')" /> <intercept-url pattern="/joinus/mypage" access="hasRole('ROLE_USER')" /> <!-- 관리자 권한 부여하기 --> <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" /> <!-- 강사의 권한 부여하기 --> <intercept-url pattern="/teacher/**" access="hasRole('ROLE_TEACHER')" /> </http> <!-- DB연동해서 회원 정보 가져오기, ref의 name을 가진 Bean을 Service-Context에 새로 추가해준다. --> <!-- 쿼리문은 Spring이 요구하는 형식에 맞는 결과가 나오도록 작성해야한다. 여기선 userid, password, enabled(활성 여부) 순 --> <authentication-manager> <authentication-provider> <jdbc-user-service data-source-ref="dataSource" users-by-username-query="SELECT ID userid, PWD password, 1 enabled FROM MEMBER WHERE ID=?" authorities-by-username-query="SELECT MEMBER_ID userid, ROLE_ID authorities FROM MEMBER_ROLE WHERE MEMBER_ID=?" /> </authentication-provider> </authentication-manager> | cs |
intercept-url 접근 시, mypage로 이동한다.
mypage에서는 권한 확인 후 login 페이지로 이동한다.
mypage는 다음과 같은 기능을 한다.
기존 : 관리자페이지, 선생님페이지, 학생페이지에서 각각 권한을 확인해야했다.
현재 : mypage에서 접근 제어를 해준다.
@joinus/mypage
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @RequestMapping("mypage") public String mypage(Principal principal){ String memberId = principal.getName(); String defaultRole = memberRoleDao.getDefaultRoleById(memberId); if (defaultRole.equals("ROLE_ADMIN")) return "redirect:../admin/index"; else if (defaultRole.equals("ROLE_TEACHER")) return "redirect:../teacher/index"; else return "redirect:../student/index"; } | cs |
로그인 후, DB에서 정보를 가져와 로그인 정보와 비교하는데, 이때 DB연결은 dataSource 부분에서 해준다.
@Beans 안에 담긴 service-context.xml의 dataSource
1 2 3 4 5 6 7 8 9 | <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://211.238.142.84/newlecture?autoReconnect=true&useSSL=false&characterEncoding=UTF-8" /> <property name="username" value="newlec" /> <property name="password" value="sclass" /> </bean> | cs |
우리가 기존에 하던 DB연동 과정을 Bean을 ref해주기만 하면 바로 사용가능하다.(편하다.)
위의 과정을 Spring에서는 DB연결 Bean하나만 생성해주면 사용 가능하다.
DB에서 로그인 정보를 가져온 후, Intercept-URL로 이동시켜준다.
원하는 경우, 각 페이지마다 Intercept-URL에 폴더 단위로 넣어주면, 각 권한별 관리가 더 용이해진다.