最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis自定義參數(shù)類型轉(zhuǎn)換器數(shù)據(jù)庫字段加密脫敏

 更新時間:2022年09月03日 08:46:06   作者:可靠的爛筆頭  
這篇文章主要為大家介紹了mybatis自定義參數(shù)類型轉(zhuǎn)換器數(shù)據(jù)庫字段加密脫敏,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1 問題背景

在數(shù)據(jù)庫存儲人員的信息時,有一些信息是敏感數(shù)據(jù),如身份證號、出生地等。為了防止信息泄漏,這些信息不允許直接在數(shù)據(jù)庫中查看,此時就需要對這些字段進(jìn)行加密存儲,但在頁面查看的仍舊是解密后的數(shù)據(jù)。這里就涉及到加解密的問題,有兩種解決方案。

2 解決方案

2.1 使用數(shù)據(jù)庫加密算法

通過數(shù)據(jù)庫自帶的加密算法,在sql里直接使用算法加解密,這種有較多缺點,不推薦使用。

  • 寫法繁瑣,不易開發(fā)維護(hù)
  • 適配多種數(shù)據(jù)庫時,算法難以統(tǒng)一,工作量也劇增

2.2 使用mybatis的自定義參數(shù)類型轉(zhuǎn)換器

通過自定義Java類型和類型轉(zhuǎn)換器,并在mapper.xml里標(biāo)注類型,通過mybatis進(jìn)行加解密。

  • 加密算法可自由選擇
  • 開發(fā)維護(hù)比較簡單方便
  • 不存在適配多種數(shù)據(jù)庫的問題

3 一般web項目使用

3.1 創(chuàng)建自定義Java類型

創(chuàng)建一個空白類,在mapper.xml文件查詢和新增修改時標(biāo)注說明,表示需要mybatis進(jìn)行相關(guān)類型轉(zhuǎn)換。

@Alias("SecretField")
public class SecretField {
}

3.2 自定義類的轉(zhuǎn)換處理器

這里使用國密SM4進(jìn)行加解密,當(dāng)然算法可自由選擇別的如AES等。

@MappedTypes注解映射剛才的自定義Java類

@MappedTypes(SecretField.class)
public class SecretFieldTypeHandler extends BaseTypeHandler<String> {
    private static final Logger log = LoggerFactory.getLogger(SecretFieldTypeHandler.class);
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        try {
            if (StringUtils.hasText(parameter)) {
                String encryptStr = Sm4Util.encryptData_ECB(parameter);
                ps.setString(i, encryptStr);
            }
        } catch (Exception e) {
            ps.setString(i, parameter);
            log.error("mybatis加密參數(shù)異常,i:{},parameter:{}", i, parameter);
        }
    }
    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String columnValue = rs.getString(columnName);
        try {
            if (StringUtils.hasText(columnValue)) {
                columnValue = Sm4Util.decryptData_ECB(columnValue);
            }
        } catch (Exception e) {
            log.error("mybatis解密參數(shù)異常,columnName:{}, columnValue:{}", columnName, columnValue);
        }
        return columnValue;
    }
    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return null;
    }
    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return null;
    }
}

3.3 配置自定義類型和類型轉(zhuǎn)換器

這一步也可使用相關(guān)注解完成。

配置文件為mybatis的配置文件,如mybatis-config.xml。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE configuration PUBLIC "-//mybaties.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
    </settings>
    <typeAliases>
            <typeAlias type="com.banxian.mybatis.alias.SecretField" alias="SecretField"/>
    </typeAliases>
    <typeHandlers>
        <typeHandler handler="com.banxian.mybatis.typehandler.SecretFieldTypeHandler" />
    </typeHandlers>
</configuration>

3.4 查詢使用

查詢返回需通過resultMap映射,在加密字段進(jìn)行javaType指明需要的類型轉(zhuǎn)換器。

另外如果舊代碼中結(jié)果集大量直接使用map返回,時間緊張的情況下,則可考慮寫一個工具類,在service里調(diào)用進(jìn)行手動解密,沒得辦法呀!。

    <resultMap id="BaseResultMap" type="User">
        <result column="sfz" property="sfz"  javaType="SecretField"/>
    </resultMap>

3.5 新增修改使用

在設(shè)置相關(guān)參數(shù)值時,也就是在#{}里,使用javaType指明需要的類型轉(zhuǎn)換器

   insert into ... values(...
    <if test="sfz!= null">
        #{sfz,jdbcType=VARCHAR,javaType=SecretField},
    </if>
   )

4. springboot項目使用

  • 自定義類型和類型轉(zhuǎn)換器代碼和上面一樣,這里不在贅述。
  • 項目使用了mybatis-plus插件。

4.1 配置自定義類型和類型轉(zhuǎn)換器

在項目配置文件里application.yml里加上配置type-handlers-package 和   type-aliases-package:分別指出你的類型轉(zhuǎn)換器所在包名和自定義類所在包名。

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted
      logic-not-delete-value: "0"
      logic-delete-value: "1"
  mapper-locations: "classpath*:/mapper/**/*.xml"
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  type-handlers-package: com.banxian.mybatis.typehandler
  type-aliases-package: com.banxian.mybatis.alias

4.2 mybatis-plus的使用

當(dāng)然上面web項目的查詢、新增和修改使用方法這里也是可以正常使用的

1)在實體類上使用注解

@TableName(autoResultMap = true)

2)在加密字段上指明類型

@TableField(value = "sfz", typeHandler = SecretFieldTypeHandler.class)

@Data
@TableName(autoResultMap = true)
public class User implements Serializable {
    private static final long serialVersionUID = 4344848828462926573L;
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Integer id;
    /**
     * 名稱
     */
    private String userName;
    /**
     * 是否刪除 1:是  0:否
     */
    @TableLogic
    private String deleted;
    /**
     * 是否有效 1:是  0:否
     */
    private String valid;
    /**
     * 創(chuàng)建時間
     */
    @TableField(value = "create_at", fill = FieldFill.INSERT)
    private LocalDateTime createAt;
    /**
     * 更新時間
     */
    @TableField(value = "update_at", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateAt;
    @TableField(value = "sfz", typeHandler = SecretFieldTypeHandler.class)
    private String sfz;
}

以上就是mybatis自定義參數(shù)類型轉(zhuǎn)換器數(shù)據(jù)庫字段加密脫敏的詳細(xì)內(nèi)容,更多關(guān)于mybatis數(shù)據(jù)庫字段加密脫敏的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

凤台县| 钟祥市| 台南市| 宜良县| 德惠市| 广灵县| 乌拉特后旗| 信宜市| 永新县| 黄平县| 巨野县| 上虞市| 离岛区| 雅安市| 富阳市| 五寨县| 广宁县| 加查县| 郁南县| 天津市| 双柏县| 图们市| 大荔县| 遂川县| 桦南县| 天峨县| 家居| 元谋县| 灌云县| 东安县| 大兴区| 龙泉市| 普洱| 宣恩县| 贡山| 邵阳县| 贵定县| 余江县| 崇仁县| 上高县| 宝兴县|