当前位置: 首页 > news >正文

北京建设工程交易网站官网建设通是个什么网站

北京建设工程交易网站官网,建设通是个什么网站,网站设置不拦截,wordpress html5 音乐背景:在erp开发中#xff0c;有些用户比较敏感数据库里的数据比较敏感#xff0c;系统给用户部署后#xff0c;公司也不想让任何人看到数据#xff0c;所以就有了数据库字段加密方案。 技术 spring boot mybatisplus 3.3.1 mybatisplus 实际提供了 字段加密方案 第一 他…背景:在erp开发中有些用户比较敏感数据库里的数据比较敏感系统给用户部署后公司也不想让任何人看到数据所以就有了数据库字段加密方案。 技术 spring boot mybatisplus 3.3.1 mybatisplus 实际提供了 字段加密方案 第一 他要钱 第二 他是在实体类上加注解 满足不了我们的需求 我们的整体需求是 用户可以自定义配置字段 在系统设置里 有个 字段加密 菜单 点击某个表单 然后显示这个表单所需要的字段 2.勾选 某个字段 这个字段 就会激活 再提交 更新表单的时候 这个字段就会加密处理 比如 系统管理 字段加密 他点击了请假表单 然后勾选 请假事由 字段加密 然后 公司的员工再次提交表单的时候 请假事由 就会被加密 。 这个需求 用户再页面上操作 我们是不需要改代码的 。 如果利用实体类加注解方案 肯定满足不了 因为 每个用户加密的字段不一样 鬼知道 加密注解要加在哪个实体类上 我们的系统 表单 和表单的字段 都定义在数据库里 所以 可以自由选择 表单和字段 这个根据各自系统自行修改 下面直接分享 加密的代码和思路 。原理我就不再说 用到的知识 自行百度即可 第一步 首先把用户勾选需要加密的 字段 缓存到redis 减少数据库查询 // 这段代码 就不分享了 自由编写 根据表名 获取 需要加密的字段 ListString stringList BaseDataUtil.getFieldPassword(insertSql.getTableName());第二步 引入加密依赖 !--对数据库字段进行加密、脱敏--dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.8.3/version/dependency第三步 配置文件 配置 第四步 编写加密方案 利用的是 框加下的这个类 BaseTypeHandler 对于这个类的介绍 自行百度 自定义一个类 然后继承 这个类 BaseTypeHandler 重写 父类方法 package com.erp.init.handlers;import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.symmetric.AES; import com.erp.init.utils.BaseDataUtil; import org.apache.ibatis.logging.jdbc.PreparedStatementLogger; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.SystemMetaObject; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils;import java.lang.reflect.Proxy; import java.nio.charset.StandardCharsets; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** User: Json* p* Date: 2023/11/14**/ public class EncryptHandler extends BaseTypeHandlerString {/*** 线上运行后勿修改会影响已加密数据解密*/private static final byte[] KEYS shc987654321camp.getBytes(StandardCharsets.UTF_8);private static final String dataWithPrefix A:Json;/*** 设置参数*/Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {if (StringUtils.isEmpty(parameter)) {ps.setString(i, null);return;}// 获取动态代理类的 InvocationHandlerPreparedStatementLogger handler (PreparedStatementLogger) Proxy.getInvocationHandler(ps);PreparedStatement preparedStatement handler.getPreparedStatement();MetaObject stmtMetaObj SystemMetaObject.forObject(preparedStatement);String sql stmtMetaObj.getValue(sql).toString();//System.out.println(sql:sql);SqlResult updateSql updateSql(sql);if(!ObjectUtils.isEmpty(updateSql)){if(updateSql.getColumnNames().size()(i-1)){// System.out.println(更新数据updateSql); // System.out.println(iupdateSql.getColumnNames().get(i-1));ListString stringList BaseDataUtil.getFieldPassword(updateSql.getTableName());if (!CollectionUtils.isEmpty(stringList) !CollectionUtils.isEmpty(updateSql.getColumnNames()) stringList.contains(updateSql.getColumnNames().get(i-1))) {AES aes SecureUtil.aes(KEYS);String encrypt aes.encryptHex(parameter);ps.setString(i,dataWithPrefix encrypt);} else {ps.setString(i, parameter);}}else{ps.setString(i, parameter);}}SqlResult insertSqlinsetSQl(sql);if(!ObjectUtils.isEmpty(insertSql)){if(insertSql.getColumnNames().size()(i-1)){// System.out.println(新增数据insertSql); // System.out.println(iinsertSql.getColumnNames().get(i-1));ListString stringList BaseDataUtil.getFieldPassword(insertSql.getTableName());if (!CollectionUtils.isEmpty(stringList) !CollectionUtils.isEmpty(insertSql.getColumnNames()) stringList.contains(insertSql.getColumnNames().get(i-1))) {AES aes SecureUtil.aes(KEYS);String encrypt aes.encryptHex(parameter);ps.setString(i, dataWithPrefix encrypt);} else {ps.setString(i, parameter);}}else{ps.setString(i, parameter);}}if(ObjectUtils.isEmpty(insertSql) ObjectUtils.isEmpty(updateSql) ){ps.setString(i, parameter);}}/*** 获取值*/Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {return decrypt(rs.getString(columnName),columnName,rs.getMetaData().getTableName(1));}/*** 获取值*/Overridepublic String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {// return null;return rs.getString(columnIndex);}/*** 获取值*/Overridepublic String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {// return null;return cs.getString(columnIndex);}public String decrypt(String value,String columnName,String tableName) {// return value;if (null value) {return null;}ListString stringList BaseDataUtil.getFieldPassword(tableName);if(CollectionUtils.isEmpty(stringList)){return value;}if (value.startsWith(dataWithPrefix) stringList.contains(columnName)) {// 是新数据去掉前缀String decryptedData value.substring(dataWithPrefix.length());return SecureUtil.aes(KEYS).decryptStr(decryptedData);} else {return value;}}public static SqlResult updateSql(String sql) {// 假设你已经有了sql字符串// String sql UPDATE your_table SET column1 value1, column2 value2 WHERE condition;// 匹配UPDATE语句Pattern updatePattern Pattern.compile(UPDATE\\s([^\\s])\\sSET\\s([^\\s]\\s*\\s*[^,](,\\s*[^\\s]\\s*\\s*[^,])*)\\sWHERE\\s(.));Matcher updateMatcher updatePattern.matcher(sql);// 如果是UPDATE语句if (updateMatcher.matches()) {String tableName updateMatcher.group(1); // 获取表名String setClause updateMatcher.group(2); // 获取SET子句// 提取更新的字段名ListString columnNames extractColumnNames(setClause);// 返回表名和字段名的信息return new SqlResult(tableName, columnNames);}return null;}private static ListString extractColumnNames(String setClause) {ListString columnNames new ArrayList();String[] columns setClause.split(\\s*,\\s*);for (String column : columns) {String[] parts column.split(\\s*\\s*);String columnName parts[0].trim();columnNames.add(columnName);}return columnNames;}private static ListString extractColumnNamesInsert(String columnsClause) {String[] columns columnsClause.split(\\s*,\\s*);ListString columnNames new ArrayList();for (String column : columns) {columnNames.add(column.trim());}return columnNames;}public static SqlResult insetSQl(String sql) {// 假设你已经有了sql字符串// String sql INSERT INTO your_table (column1, column2) VALUES (value1, value2);// 匹配INSERT语句Pattern insertPattern Pattern.compile(INSERT\\sINTO\\s([^\\s])\\s*\\(([^)])\\)\\s*VALUES\\s*\\(([^)])\\));Matcher insertMatcher insertPattern.matcher(sql);// 如果是INSERT语句if (insertMatcher.matches()) {String tableName insertMatcher.group(1); // 获取表名String columnsClause insertMatcher.group(2); // 获取列名的部分// String valuesClause insertMatcher.group(3); // 获取值的部分// 提取新增的字段名和对应的值ListString columnNames extractColumnNamesInsert(columnsClause);// 返回表名、字段名和对应值的信息return new SqlResult(tableName, columnNames);}return null;}} 第五步 把这个类注册到配置文件中 package com.erp.init.mybatisplus;import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; import com.erp.init.handlers.EncryptHandler; import org.apache.ibatis.type.JdbcType; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;/*** User: Json* p* Date: 2023/11/15**/ Configuration public class MyBatisConfig {Beanpublic ConfigurationCustomizer configurationCustomizer() {return configuration - {//String.class, JdbcType.VARCHAR 这个是 只对 字符串进行处理// int float 的加密 根据字符串再扩展一个类就行了 configuration.getTypeHandlerRegistry().register(String.class, JdbcType.VARCHAR, new EncryptHandler());// 注册其他类型处理器};} } 这要编写后 每次 mybatisplus 调用 新增 和 更新 批量更新 批量操作 都会触发这里的代码 实现字段加解密
http://www.hkea.cn/news/14495129/

相关文章:

  • 网站建设公司有哪些重要职务注册公司注册资金可以随便写吗
  • 免费x网站域名jsp简述网站开发流程
  • 政务网站建设浙江wordpress怎么更改主题文字颜色
  • 顶尖网站设计内部网站建设软件
  • 爱站数据网站建设加空间
  • 专业长春网站建设哪家好宜春做网站公司
  • 福建住房与城乡建设网站windows优化大师可以卸载吗
  • 网站开发如何实现数据库的链接秦皇岛市城乡建设局网站
  • 网站流量作用北京网站建设哪便宜
  • 做一晚水泥工歌曲网站WordPress邮件代发
  • 如何做多语言网站网站建设版面分几页合适
  • 广西省建设注册管理网站山东省市场监督管理局官网
  • 专业中山建网站公司网站设计中的事件是什么
  • 网站维护等湖南省新化县建设局网站
  • 电子商务网站建设汉狮天津做网站哪个公司好
  • 如何提网站建设需求捡个校花做老婆是哪个网站的
  • 中国档案网站建设的特点网站备案个人备案公司网站
  • 企业网站设计规范初中生编程入门先学什么
  • 网站设网站设计做羞羞的事视频网站
  • 江西网站制作有自己网站做淘宝客赚钱吗
  • 学校网站建设目的是什么意思如何用区块链加密wordpress
  • 自学网站建设 难吗aso搜索排名优化
  • 做坑人网站二维码做网站除了有服务器还需要什么问题
  • 郑州建设网站公司wordpress 小工具 位置
  • 五台网站建设成都网站建设益友网络
  • 网站前端切页面时间代理网站官网
  • 广州快速建站公司推荐网站两边横幅怎么做
  • 南明区住房和城乡建设局网站上洛米原创wordpress
  • pycharm 网站开发长沙网络推广联系昔年下拉
  • 网站做图标链接企业做定制网站的好处