공부/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&amp;useSSL=false&amp;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에 폴더 단위로 넣어주면, 각 권한별 관리가 더 용이해진다.