본문으로 바로가기

이전까지는 xml에 사용자의 정보를 등록시켜서 인메모리로 인증을 했었다. 만약에 사용자가 100명, 1000명이 되면 어떻게 할 것인가? 그 많은 사용자들을 xml에 저장할 순 없다. 그렇기에 DB를 이용해서 사용자 정보를 저장하고 인증을 해야한다. 지금 소개할 방법은 간단한 로그인 인증이다. DB의 테이블만 이용해서 인증을 하는 방법이다. 인증 절차 인터페이스를 커스텀을 한다면 지금 이 방법은 쓰지 않는다.(...) 하지만 MyBatis DB 연결이 잘 되어있는 지 확인하는데엔 좋은 방법인 거 같아서 작성해본다.


1. MyBatis, MySQL 라이브러리 추가

pom.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
        <!-- MyBatis -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.2</version>
        </dependency>
         
        <!-- MySQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
         
        <!-- log4j-remix -->
        <dependency>
            <groupId>org.lazyluke</groupId>
                <artifactId>log4jdbc-remix</artifactId>
            <version>0.2.7</version>
        </dependency>
cs



2. dataSource

context-dataSource.xml

1
2
3
4
5
6
     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/스키마명"/>
        <property name="username" value="아이디"/>
        <property name="password" value="비밀번호"/>
    </bean>
cs

간단한 로그인에 필요한 부분이다. 전체적으로 보고 싶으면 아래의 펼침을 누르면 된다.




3. DB 생성

1
2
3
4
5
6
7
8
CREATE TABLE `user` (
  `ID` varchar(100NOT NULL,
  `PASSWORD` varchar(300NOT NULL,
  `NAME` varchar(45NOT NULL,
  `AUTHORITY` varchar(50NOT NULL DEFAULT 'ROLE_USER',
  `ENABLED` tinyint(1unsigned zerofill DEFAULT '1',
  PRIMARY KEY (`ID`)
ENGINE=InnoDB DEFAULT CHARSET=utf8
cs

여기서는 ENABLED 컬럼이 반드시 있어야 한다. 계정의 활성화, 비활성화의 여부를 알려준다. (1:활성화, 0:비활성화)



4. jdbc-user-service

context-security.xml

1
2
3
4
5
6
7
8
9
<jdbc-user-service data-source-ref="dataSource" id="userService"
    users-by-username-query="SELECT ID as loginId, PASSWORD as loginPwd, ENABLED FROM user WHERE ID=?"
    authorities-by-username-query="SELECT ID as loginID, AUTHORITY FROM user WHERE ID=?"
/>
        
<authentication-manager>
    <authentication-provider user-service-ref="userService">
    </authentication-provider>
</authentication-manager>
cs

- 01행: data-source-ref에는 context-dataSource에서 설정한 bean id를 가져오면 된다. jdbc-user-service id는 userService 이다.

- 02행: 사용자를 인증하는 컬럼이다. ID as loginId, PASSWORD as loginPwd, ENABLED 부분에 유의해서 각자의 설정에 맞게 작성하면 된다.

- 03행: 사용자의 권한을 가져오는 컬럼이다. 마찬가지로 ID as loginID, AUTHORITY 부분에 유의해서 작성하면 된다.


** as 뒤에 있는 부분은 security 설정에서 <form-login> 태그에 설정한 값들이다.


*** 사용자 인증 컬럼에서 ENABLED가 없으면 Column Index out of ragne, 3>2. ; nested exception is java.sql.SQLException: 과 같은 에러가 날 수도 있다. 사용자 인증을 가져오는 users-by-username-query에서는 username, password, enabled 이 3가지 컬럼이 필수이다.



5. 실행

계정이 활성화되어있는 사용자의 아이디로 로그인을 하게 되면 해당 쿼리 로그들을 볼 수 있다. 그럼 비활성화된 계정을 치면 어떻게 될까?

ENABLED 컬럼이 false로 나왔다. 계정이 비활성화되었다는 의미이다. 따라서 로그인에 실패하고 계정이 비활성화되었다는 에러 문구가 나온다. 드디어 아이디와 비밀번호가 맞지않다는 에러 문구말고 다른 에러문구를 보게 되었다. 솔직히 메세지 프로퍼티를 만들면서 영원히 못 볼 줄 알았다. (ㅋㅋㅋ)


권한에 맞게 경로를 이동하고 로그인 에러문구도 적절하게 나온다면 성공한거다! MyBatis의 연결이 제대로 잘 되었다. GitHub


댓글을 달아 주세요

  1. 띠로리 2020.01.06 16:55

    db에 user테이블은 enable 컬럼의 값이 0비활성화, 1활성화 아닌가요? 왜 저는 값이 1인데 무적권 비활성화된 계정이라고 나올까요..?

    • BlogIcon #에게 2020.01.06 17:02 신고

      enabled 칼럼명이여야 적용될거에요!

    • 띠로리 2020.01.06 17:05

      컬럼명은 enabled 컬럼으로 만들었습니다..

      이또한 또 자문자답이네요 ㅠㅠ
      context-security select문에 대문다로 ENABLE으로 넣어서 일어난 문제였네요...

      감사합니다 ㅠㅠ

    • BlogIcon #에게 2020.01.06 17:12 신고

      앗 제 enable 이라고 말하셔섷ㅎㅎ 제 생각엔 numberic 타입 때뭉인 거 같아요! 데이터 숫자로 인식해서 false 처리 되는 거 같아요