사용자에 대한 password는 Hash를 이용하여 데이터베이스에 저장한다.
일반적으로 Spring framework를 사용하는 경우 BCryptPasswordEncoder를 이용하여 서비스에서 Hash값을 생성하여
데이터베이스에 저장한다.
입력한 암호를 Mybatis에 제공하고 있는 TypeHandler를 구현하여 Hash를 생성하여 데이터베이스에 저장하는
방법이 있다.
Mybatis의 TypeHandler의 구현체를 생성한다.
import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeHandler; import com.lgcns.spring.crypt.PasswordEncoder; public class PasswordHandler implements TypeHandler{ @Override public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { /** Password Encoding **/ String encodePassword = null; try { encodePassword = PasswordEncoder.encode(parameter); } catch (Exception e) { String errmsg = String.format("Fail to encrypt passwod :: [%s]", parameter); throw new SQLException(errmsg); } ps.setString(i, encodePassword); } @Override public String getResult(ResultSet rs, String columnName) throws SQLException { return rs.getString(columnName); } @Override public String getResult(ResultSet rs, int columnIndex) throws SQLException { return rs.getString(columnIndex); } @Override public String getResult(CallableStatement cs, int columnIndex) throws SQLException { return cs.getString(columnIndex); } } |
본 예제에서는 setParamter 메소드에서 Hash를 생성하여 PreparedStatement에 Hash 값을 저장한다.
INSERT INTO USERS ( USERNAME ,USER_ROLE_ID ,PASSWORD ,ENABLED ,CREATE_TIME ,CREATE_BY ,PAGE_ALLOWED ) VALUES ( #{username} , #{userRoleId} , #{password, typeHandler=com.lgcns.spring.mybatis.handler.PasswordHandler} , #{enabled} , #{createTime} , #{createTime} , #{pageAllowed} ) |
SQL에서 password 컬럼에 TypeHandler를 정의하면 TypeHandler에 정의되어 있는 setParameter에서 Return한 값을 데이터베이스에 저장한다.
Mybatis의 TypeHanlder를 이용하여 다야한 Masking 처리도 가능하다. 특히 카드번호, 주민번호 등 Masking 처리가 필요한 경우 적용하면 개발 시 편의성과 생산성이 향상될 수 있다.
'Spring Framrwork' 카테고리의 다른 글
Spring MVC 테스트 자동화 및 커버리지 분석 (0) | 2020.05.08 |
---|---|
Spring Framwork의 RequetMapping 정보 추출하기 (0) | 2020.03.03 |
Spring Transaction Simulation 기능 (0) | 2020.03.03 |
Mybatis SQL Logging (0) | 2019.04.28 |
Spring Framework Custom Annotation 만들기 (0) | 2018.09.12 |