데이터 베이스에 토큰 테이블 생성 (Oracle)
CREATE TABLE TOKENTBL(
USERID VARCHAR2(30) CONSTRAINT PK_TOKEN_ID PRIMARY KEY,
TOKEN VARCHAR2(200) NOT NULL,
REGDATE TIMESTAMP DEFAULT CURRENT_DATE,
CONSTRAINT FK_TOKENTBL_USERID FOREIGN KEY(USERID) REFERENCES MEMBERTBL(USERID)
);
dto파일에 TokenDTO.java 생성
package com.example.dto;
import java.sql.Date;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@NoArgsConstructor
public class TokenDTO {
String userid;
String token;
Date regdate;
}
MemberRestController.java에 login 코드
// 127.0.0.1:8080/BOOT1/api/member/login.json
// application/json
@PostMapping(value="/login.json")
public Map<String, Object> loginPOST(
@RequestBody MemberDTO member){
System.out.println(member.toString());
Map<String, Object> retMap = new HashMap<>();
try {
// string 권한으로 collection으로 변경
String[] strRole = { member.getRole() };
Collection<GrantedAuthority> role
= AuthorityUtils.createAuthorityList(strRole);
//CustomDetailsService와 같은 역할
UsernamePasswordAuthenticationToken
upat = new UsernamePasswordAuthenticationToken(
member.getUserid(), member.getUserpw(), role);
authenticationManager.authenticate(upat);
String token = jwtUtil.generateToken(member.getUserid());
// TOKENTBL에 아이디가 존재 한다면 insert 없으면 update를 한 다음 토큰 전송(토큰을 관리 해야 함.)
retMap.put("status", 200);
retMap.put("token" , token);
}
catch(Exception e) {
e.printStackTrace();
retMap.put("status", -1);
}
return retMap;
}
TokenMapper.java 만들기
// 127.0.0.1:8080/BOOT1/api/member/login.json
// application/json
@PostMapping(value="/login.json")
public Map<String, Object> loginPOST(
@RequestBody MemberDTO member){
System.out.println(member.toString());
Map<String, Object> retMap = new HashMap<>();
try {
// string 권한으로 collection으로 변경
String[] strRole = { member.getRole() };
Collection<GrantedAuthority> role
= AuthorityUtils.createAuthorityList(strRole);
//CustomDetailsService와 같은 역할
UsernamePasswordAuthenticationToken
upat = new UsernamePasswordAuthenticationToken(
member.getUserid(), member.getUserpw(), role);
authenticationManager.authenticate(upat);
String token = jwtUtil.generateToken(member.getUserid());
// TOKENTBL에 아이디가 존재 한다면 insert 없으면 update를 한 다음 토큰 전송(토큰을 관리 해야 함.)
retMap.put("status", 200);
retMap.put("token" , token);
}
catch(Exception e) {
e.printStackTrace();
retMap.put("status", -1);
}
return retMap;
}
resources/mapper 파일에 tokenMapper.xml 만들기
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.TokenMapper">
<insert id="upsertToken" parameterType="com.example.dto.TokenDTO">
MERGE INTO
TOKENTBL <!-- 토큰테이블에 USERID가 일치 하는게 있다면 TOKEN, REGDATE를 업데이트 하고 -->
USING DUAL
ON USERID=#{userid}
WHEN MATCHED THEN
UPDATE SET TOKEN=#{token}, REGDATE=CURRENT_DATE
WHEN NOT MATCHED THEN <!-- 없다면 USERID,TOKEN,REGDATE를 추가한다 -->
INSERT (USERID, TOKEN, REGDATE ) VALUES(#{userid},#{token}, CURRENT_DATE)
</insert>
</mapper>
MemberRestController.java에 코드 추가
@Autowired
TokenMapper tMapper;
.
.
.
.
@PostMapping(value = "/login.json")
public Map<String, Object> loginPOST(
@RequestBody MemberDTO member) {
System.out.println(member.toString());
Map<String, Object> retMap = new HashMap<>();
try {
// string 권한으로 collection으로 변경
String[] strRole = { member.getRole() };
Collection<GrantedAuthority> role = AuthorityUtils.createAuthorityList(strRole);
// CustomDetailsService와 같은 역할
UsernamePasswordAuthenticationToken upat = new UsernamePasswordAuthenticationToken(
member.getUserid(), member.getUserpw(), role);
authenticationManager.authenticate(upat);
String token = jwtUtil.generateToken(member.getUserid());
// TOKENTBL에 아이디가 존재 한다면 insert 없으면 update를 한 다음 토큰 전송(어떤 아이디가 어떤 토큰을 발행 했는지 토큰을 관리 해야 함.)
TokenDTO obj = new TokenDTO();
obj.setUserid(member.getUserid());
obj.setToken(token);
int ret = tMapper.upsertToken(obj);
retMap.put("status", 200);
if (ret == 1) {
retMap.put("token", token);
}
}
catch (Exception e) {
e.printStackTrace();
retMap.put("status", -1);
}
return retMap;
}
DB에 토큰이 잘 들어갔는지 확인
SELECT * FROM TOKENTBL;