Commit c5a6ad87 by 郑冰晶

数据库加密组件

parent 1585c4dd
package com.secoo.mall.datasource.security.demo.bean;
import com.secoo.mall.datasource.security.demo.bean.common.PageCriteria;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class MUserCriteria extends PageCriteria {
private Long id;
private String creator;
private Date createTime;
private Long version;
// --------- 扩展-------------
private String orderByClause = "id desc";
private String groupByClause;
private String fields;
private List<Long> ids;
}
package com.secoo.mall.datasource.security.demo.bean;
import com.secoo.mall.datasource.security.demo.dao.entity.PriceRuleTask;
import lombok.Data;
/**
* 定价规则任务记录表
*
* @Author like
* @Date 2020/4/1
*/
@Data
public class PriceRuleTaskBean extends PriceRuleTask {
private static final long serialVersionUID = 3992045013900981597L;
private String cnName;
private String enName;
private String taskTypeDesc;
private String taskStatusDesc;
private String triggerTypeDesc;
private String checkStatusDesc;
private String pushStatusDesc;
private String europePushStatusDesc;
private int tableShardNo;
}
\ No newline at end of file
...@@ -32,7 +32,7 @@ import java.util.Properties; ...@@ -32,7 +32,7 @@ import java.util.Properties;
**/ **/
@Slf4j @Slf4j
@Configuration @Configuration
@MapperScan(basePackages = "com.secoo.mall.datasource.security.demo.dao.mapper", sqlSessionFactoryRef = "activitySqlSessionFactory") @MapperScan(basePackages = "com.secoo.mall.datasource.security.demo.dao.activity.mapper", sqlSessionFactoryRef = "activitySqlSessionFactory")
public class ActivityDBConfig { public class ActivityDBConfig {
@Value("${sql.show}") @Value("${sql.show}")
...@@ -67,8 +67,8 @@ public class ActivityDBConfig { ...@@ -67,8 +67,8 @@ public class ActivityDBConfig {
return source; return source;
} }
@Bean @Bean("activityDataSourcePoolMetadataProvider")
public DataSourcePoolMetadataProvider dataSourcePoolMetadataProvider(@Qualifier("activityDataSource") DataSource activityDataSource) { public DataSourcePoolMetadataProvider activityDataSourcePoolMetadataProvider(@Qualifier("activityDataSource") DataSource activityDataSource) {
DataSourcePoolMetadataProvider poolMetadataProvider = dataSource -> new DataSourcePoolMetadata(activityDataSource, "select 1"); DataSourcePoolMetadataProvider poolMetadataProvider = dataSource -> new DataSourcePoolMetadata(activityDataSource, "select 1");
return poolMetadataProvider; return poolMetadataProvider;
} }
...@@ -91,8 +91,8 @@ public class ActivityDBConfig { ...@@ -91,8 +91,8 @@ public class ActivityDBConfig {
return sessionFactoryBean.getObject(); return sessionFactoryBean.getObject();
} }
@Bean @Bean("activitySqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate( public SqlSessionTemplate activitySqlSessionTemplate(
@Qualifier("activitySqlSessionFactory") SqlSessionFactory factory) { @Qualifier("activitySqlSessionFactory") SqlSessionFactory factory) {
return new SqlSessionTemplate(factory); return new SqlSessionTemplate(factory);
} }
......
package com.secoo.mall.datasource.security.demo.config.datasource;
import com.secoo.mall.datasource.bean.MatrixDataSource;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Slf4j
@Configuration
@MapperScan(basePackages = "com.secoo.mall.datasource.security.demo.dao.erp.mapper", sqlSessionFactoryRef = "erpSqlSessionFactory")
public class ErpDBConfig {
@Value("${sql.show}")
private Boolean sqlShow;
@Bean("erpDataSourcePoolMetadataProvider")
public DataSourcePoolMetadataProvider erpDataSourcePoolMetadataProvider(@Qualifier("erpDataSource") DataSource erpDataSource) {
DataSourcePoolMetadataProvider poolMetadataProvider = dataSource -> new DataSourcePoolMetadata(erpDataSource, "select 1");
return poolMetadataProvider;
}
@Bean("erpDataSource")
public DataSource dataSource() {
DataSource source = null;
try {
source = new MatrixDataSource("erp-slave");
} catch (Exception e) {
log.error("配置shard-jdbc失败", e);
}
return source;
}
@Bean("erpSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("erpDataSource") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
org.apache.ibatis.session.Configuration config = new org.apache.ibatis.session.Configuration();
config.setMapUnderscoreToCamelCase(true);
sessionFactoryBean.setConfiguration(config);
if(sqlShow){
config.setLogImpl(StdOutImpl.class);
}
return sessionFactoryBean.getObject();
}
@Bean("erpSqlSessionTemplate")
public SqlSessionTemplate erpSqlSessionTemplate(
@Qualifier("erpSqlSessionFactory") SqlSessionFactory factory) {
return new SqlSessionTemplate(factory);
}
}
package com.secoo.mall.datasource.security.demo.controller;
import com.alibaba.fastjson.JSON;
import com.secoo.mall.datasource.security.demo.bean.PriceRuleTaskCriteria;
import com.secoo.mall.datasource.security.demo.dao.activity.entity.PriceRuleTask;
import com.secoo.mall.datasource.security.demo.dao.activity.mapper.PriceRuleTaskMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("activity")
public class ActivityController {
@Autowired
private PriceRuleTaskMapper priceRuleTaskMapper;
@RequestMapping("select")
public String select(Long id,String plainText,Integer pageSize) {
PriceRuleTaskCriteria priceRuleTaskCriteria = new PriceRuleTaskCriteria();
if(id != null){
priceRuleTaskCriteria.setId(id);
}
if(plainText != null){
priceRuleTaskCriteria.setCreator(plainText);
}
priceRuleTaskCriteria.setPageSize((pageSize != null && pageSize > 0)?pageSize:5);
List<PriceRuleTask> priceRuleTasks = this.priceRuleTaskMapper.queryPriceRuleTaskList(priceRuleTaskCriteria);
String data = JSON.toJSONString(priceRuleTasks);
log.debug("data={}", data);
return data;
}
@RequestMapping("insert")
public String insert() {
PriceRuleTask insertPriceRuleTask1 = new PriceRuleTask();
insertPriceRuleTask1.setBrandId(5L);
insertPriceRuleTask1.setTaskId("");
insertPriceRuleTask1.setMergeTaskId("");
insertPriceRuleTask1.setTaskType(1);
insertPriceRuleTask1.setTaskStatus(0);
insertPriceRuleTask1.setTriggerType(1);
insertPriceRuleTask1.setCheckStatus(0);
insertPriceRuleTask1.setCheckPointDate(new Date());
insertPriceRuleTask1.setPushStatus(0);
insertPriceRuleTask1.setEuropePushStatus(0);
insertPriceRuleTask1.setRemark("加密测试");
insertPriceRuleTask1.setShardNo(0);
insertPriceRuleTask1.setCreator(String.valueOf(RandomUtils.nextInt(0,1000)));
insertPriceRuleTask1.setCreatorId(0L);
insertPriceRuleTask1.setCreateDate(new Date());
insertPriceRuleTask1.setModifier("");
insertPriceRuleTask1.setModifierId(0L);
insertPriceRuleTask1.setModifyDate(new Date());
insertPriceRuleTask1.setVersion(0L);
PriceRuleTask insertPriceRuleTask2 = new PriceRuleTask();
insertPriceRuleTask2.setBrandId(5L);
insertPriceRuleTask2.setTaskId("");
insertPriceRuleTask2.setMergeTaskId("");
insertPriceRuleTask2.setTaskType(1);
insertPriceRuleTask2.setTaskStatus(0);
insertPriceRuleTask2.setTriggerType(1);
insertPriceRuleTask2.setCheckStatus(0);
insertPriceRuleTask2.setCheckPointDate(new Date());
insertPriceRuleTask2.setPushStatus(0);
insertPriceRuleTask2.setEuropePushStatus(0);
insertPriceRuleTask2.setRemark("加密测试");
insertPriceRuleTask2.setShardNo(0);
insertPriceRuleTask2.setCreator(String.valueOf(RandomUtils.nextInt(0,1000)));
insertPriceRuleTask2.setCreatorId(0L);
insertPriceRuleTask2.setCreateDate(new Date());
insertPriceRuleTask2.setModifier("");
insertPriceRuleTask2.setModifierId(0L);
insertPriceRuleTask2.setModifyDate(new Date());
insertPriceRuleTask2.setVersion(0L);
List<PriceRuleTask> priceRuleTasks = new ArrayList<>();
priceRuleTasks.add(insertPriceRuleTask1);
priceRuleTasks.add(insertPriceRuleTask2);
this.priceRuleTaskMapper.batchInsert(priceRuleTasks);
log.debug("id={}", insertPriceRuleTask1.getId());
return String.valueOf("id="+insertPriceRuleTask1.getId());
}
@RequestMapping("update")
public String update(Long id,String plainText) {
PriceRuleTask updatePriceRuleTask = new PriceRuleTask();
updatePriceRuleTask.setId(id);
updatePriceRuleTask.setCreator(plainText);
int rows = this.priceRuleTaskMapper.updateByPrimaryKeySelective(updatePriceRuleTask);
log.debug("rows={}", rows);
return String.valueOf(rows);
}
@RequestMapping("batchUpdate")
public String batchUpdate(@RequestBody PriceRuleTaskCriteria priceRuleTaskCriteria) {
List<PriceRuleTask> updatePriceRuleTasks = new ArrayList<>();
for(Long id:priceRuleTaskCriteria.getIds()){
PriceRuleTask updatePriceRuleTask = new PriceRuleTask();
updatePriceRuleTask.setId(id);
updatePriceRuleTask.setCreator(priceRuleTaskCriteria.getCreator());
updatePriceRuleTasks.add(updatePriceRuleTask);
}
int rows = this.priceRuleTaskMapper.batchUpdate(updatePriceRuleTasks);
log.debug("rows={}", rows);
return String.valueOf(rows);
}
}
package com.secoo.mall.datasource.security.demo.controller;
import com.alibaba.fastjson.JSON;
import com.secoo.mall.datasource.security.demo.bean.MUserCriteria;
import com.secoo.mall.datasource.security.demo.dao.erp.entity.MUser;
import com.secoo.mall.datasource.security.demo.dao.erp.mapper.MUserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("erp")
public class ErpController {
@Autowired
private MUserMapper mUserMapper;
@RequestMapping("select")
public String select(Long id,String plainText,Integer pageSize) {
MUserCriteria mUserCriteria = new MUserCriteria();
if(id != null){
mUserCriteria.setId(id);
}
if(plainText != null){
mUserCriteria.setCreator(plainText);
}
mUserCriteria.setPageSize((pageSize != null && pageSize > 0)?pageSize:5);
List<MUser> mUsers = this.mUserMapper.queryList(mUserCriteria);
String data = JSON.toJSONString(mUsers);
log.debug("data={}", data);
return data;
}
}
package com.secoo.mall.datasource.security.demo.controller;
import com.alibaba.fastjson.JSON;
import com.secoo.mall.datasource.security.demo.bean.PriceRuleTaskCriteria;
import com.secoo.mall.datasource.security.demo.dao.entity.PriceRuleTask;
import com.secoo.mall.datasource.security.demo.dao.mapper.PriceRuleTaskMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("test")
public class TestController {
@Autowired
private PriceRuleTaskMapper priceRuleTaskMapper;
@RequestMapping("select")
public String select(Long id,String plainText) {
PriceRuleTaskCriteria priceRuleTaskCriteria = new PriceRuleTaskCriteria();
if(id != null){
priceRuleTaskCriteria.setId(id);
}
if(plainText != null){
priceRuleTaskCriteria.setCreator(plainText);
}
priceRuleTaskCriteria.setPageSize(1);
List<PriceRuleTask> priceRuleTasks = this.priceRuleTaskMapper.queryPriceRuleTaskList(priceRuleTaskCriteria);
String data = JSON.toJSONString(priceRuleTasks);
log.debug("data={}", data);
return data;
}
@RequestMapping("insert")
public String insert() {
PriceRuleTask insertPriceRuleTask = new PriceRuleTask();
insertPriceRuleTask.setBrandId(5L);
insertPriceRuleTask.setTaskId("");
insertPriceRuleTask.setMergeTaskId("");
insertPriceRuleTask.setTaskType(1);
insertPriceRuleTask.setTaskStatus(0);
insertPriceRuleTask.setTriggerType(1);
insertPriceRuleTask.setCheckStatus(0);
insertPriceRuleTask.setCheckPointDate(new Date());
insertPriceRuleTask.setPushStatus(0);
insertPriceRuleTask.setEuropePushStatus(0);
insertPriceRuleTask.setRemark("加密测试");
insertPriceRuleTask.setShardNo(0);
insertPriceRuleTask.setCreator(String.valueOf(RandomUtils.nextInt(0,1000)));
insertPriceRuleTask.setCreatorId(0L);
insertPriceRuleTask.setCreateDate(new Date());
insertPriceRuleTask.setModifier("");
insertPriceRuleTask.setModifierId(0L);
insertPriceRuleTask.setModifyDate(new Date());
insertPriceRuleTask.setVersion(0L);
int rows = this.priceRuleTaskMapper.insertSelective(insertPriceRuleTask);
log.debug("id={}", insertPriceRuleTask.getId());
return String.valueOf("id="+insertPriceRuleTask.getId());
}
@RequestMapping("update")
public String update(Long id,String plainText) {
PriceRuleTask updatePriceRuleTask = new PriceRuleTask();
updatePriceRuleTask.setId(id);
updatePriceRuleTask.setCreator(plainText);
int rows = this.priceRuleTaskMapper.updateByPrimaryKeySelective(updatePriceRuleTask);
log.debug("rows={}", rows);
return String.valueOf(rows);
}
}
package com.secoo.mall.datasource.security.demo.dao.mapper; package com.secoo.mall.datasource.security.demo.dao.activity.mapper;
import com.secoo.mall.datasource.security.demo.bean.PriceRuleTaskCriteria; import com.secoo.mall.datasource.security.demo.bean.PriceRuleTaskCriteria;
import com.secoo.mall.datasource.security.demo.dao.entity.PriceRuleTask; import com.secoo.mall.datasource.security.demo.dao.activity.entity.PriceRuleTask;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
......
<?xml version="1.0" encoding="UTF-8" ?> <?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" > <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.secoo.mall.datasource.security.demo.dao.mapper.PriceRuleTaskMapper"> <mapper namespace="com.secoo.mall.datasource.security.demo.dao.activity.mapper.PriceRuleTaskMapper">
<resultMap id="BaseResultMap" type="com.secoo.mall.datasource.security.demo.dao.entity.PriceRuleTask"> <resultMap id="BaseResultMap" type="com.secoo.mall.datasource.security.demo.dao.activity.entity.PriceRuleTask">
<id column="id" property="id" jdbcType="BIGINT"/> <id column="id" property="id" jdbcType="BIGINT"/>
<result column="brand_id" property="brandId" jdbcType="BIGINT"/> <result column="brand_id" property="brandId" jdbcType="BIGINT"/>
<result column="task_id" property="taskId" jdbcType="VARCHAR"/> <result column="task_id" property="taskId" jdbcType="VARCHAR"/>
...@@ -131,7 +131,7 @@ ...@@ -131,7 +131,7 @@
</if> </if>
</where> </where>
</sql> </sql>
<insert id="insert" parameterType="com.secoo.mall.datasource.security.demo.dao.entity.PriceRuleTask" <insert id="insert" parameterType="com.secoo.mall.datasource.security.demo.dao.activity.entity.PriceRuleTask"
useGeneratedKeys="true" keyProperty="id" keyColumn="id"> useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into t_price_rule_task (brand_id,task_id, merge_task_id, task_type, task_status, trigger_type, insert into t_price_rule_task (brand_id,task_id, merge_task_id, task_type, task_status, trigger_type,
check_status, check_point_date,push_status,europe_push_status,remark,cacl_time,shard_no, create_date,creator_id, creator, version) check_status, check_point_date,push_status,europe_push_status,remark,cacl_time,shard_no, create_date,creator_id, creator, version)
...@@ -139,7 +139,7 @@ ...@@ -139,7 +139,7 @@
#{checkStatus,jdbcType=INTEGER}, #{checkPointDate,jdbcType=TIMESTAMP},#{pushStatus,jdbcType=INTEGER},#{europePushStatus,jdbcType=INTEGER},#{remark,jdbcType=VARCHAR},#{caclTime}, #{checkStatus,jdbcType=INTEGER}, #{checkPointDate,jdbcType=TIMESTAMP},#{pushStatus,jdbcType=INTEGER},#{europePushStatus,jdbcType=INTEGER},#{remark,jdbcType=VARCHAR},#{caclTime},
#{shardNo,jdbcType=TINYINT},now(),#{creatorId,jdbcType=BIGINT},#{creator,jdbcType=VARCHAR}, 1) #{shardNo,jdbcType=TINYINT},now(),#{creatorId,jdbcType=BIGINT},#{creator,jdbcType=VARCHAR}, 1)
</insert> </insert>
<insert id="insertSelective" parameterType="com.secoo.mall.datasource.security.demo.dao.entity.PriceRuleTask" <insert id="insertSelective" parameterType="com.secoo.mall.datasource.security.demo.dao.activity.entity.PriceRuleTask"
useGeneratedKeys="true" keyProperty="id" keyColumn="id"> useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into t_price_rule_task insert into t_price_rule_task
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">
...@@ -310,7 +310,7 @@ ...@@ -310,7 +310,7 @@
</update> </update>
<update id="updateByPrimaryKeySelective" <update id="updateByPrimaryKeySelective"
parameterType="com.secoo.mall.datasource.security.demo.dao.entity.PriceRuleTask"> parameterType="com.secoo.mall.datasource.security.demo.dao.activity.entity.PriceRuleTask">
update t_price_rule_task update t_price_rule_task
<set> <set>
<if test="brandId != null"> <if test="brandId != null">
......
package com.secoo.mall.datasource.security.demo.dao.erp.entity;
import lombok.Data;
import java.util.Date;
@Data
public class MUser {
private Long id;
private String creator;
private Date createTime;
private Long version;
}
package com.secoo.mall.datasource.security.demo.dao.erp.mapper;
import com.secoo.mall.datasource.security.demo.bean.MUserCriteria;
import com.secoo.mall.datasource.security.demo.dao.activity.entity.PriceRuleTask;
import com.secoo.mall.datasource.security.demo.dao.erp.entity.MUser;
import java.util.List;
public interface MUserMapper {
int insert(MUser record);
int insertSelective(MUser record);
void batchInsert(List<MUser> records);
int updateByPrimaryKeySelective(MUser record);
int batchUpdate(List<MUser> records);
int deleteByPrimaryKey(Long id);
MUser selectByPrimaryKey(Long id);
List<MUser> queryList(MUserCriteria mUserCriteria);
int queryCount(MUserCriteria mUserCriteria);
}
\ No newline at end of file
<?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.secoo.mall.datasource.security.demo.dao.erp.mapper.MUserMapper">
<resultMap id="BaseResultMap" type="com.secoo.mall.datasource.security.demo.dao.erp.entity.MUser">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
<result column="creator" property="creator" jdbcType="VARCHAR"/>
<result column="version" property="version" jdbcType="BIGINT"/>
</resultMap>
<sql id="Base_Column_List">
id, create_time, creator, version
</sql>
<sql id="Example_Where_Clause">
<where>
<if test="id != null ">
and id = #{id,jdbcType=BIGINT}
</if>
<if test="ids != null and ids.size()>0">
and id in
<foreach collection="ids" item="item" open="(" close=")" separator=",">#{item}</foreach>
</if>
<if test="creator != null and creator != ''">
and creator = #{creator}
</if>
</where>
</sql>
<insert id="insert" parameterType="com.secoo.mall.datasource.security.demo.dao.erp.entity.MUser"
useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into m_user (id, create_time, creator, version)
values (#{id,jdbcType=BIGINT},now(),#{creator,jdbcType=VARCHAR}, 1)
</insert>
<insert id="insertSelective" parameterType="com.secoo.mall.datasource.security.demo.dao.erp.entity.MUser"
useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into m_user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="createTime != null">
create_time,
</if>
<if test="creator != null">
creator,
</if>
<if test="version != null">
version,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id,jdbcType=BIGINT},
</if>
<if test="createTime != null">
#{createTime},
</if>
<if test="creator != null">
#{creator},
</if>
<if test="version != null">
#{version},
</if>
</trim>
</insert>
<insert id="batchInsert" keyProperty="id">
insert into m_user (id, create_time, creator, version)
values
<foreach item="item" collection="list" separator=",">
(#{item.id,jdbcType=BIGINT}, now(),#{item.creator,jdbcType=VARCHAR}, 1)
</foreach>
</insert>
<update id="updateByPrimaryKeySelective"
parameterType="com.secoo.mall.datasource.security.demo.dao.erp.entity.MUser">
update m_user
<set>
<if test="createTime != null">
create_time = #{createTime},
</if>
<if test="creator != null">
creator = #{creator,jdbcType=VARCHAR},
</if>
version = version + 1
</set>
where id = #{id,jdbcType=BIGINT}
</update>
<update id="batchUpdate">
<foreach collection="list" item="item" separator=";">
update m_user
<set>
<if test="item.createTime != null">
create_time = #{item.createTime},
</if>
<if test="item.creator != null">
creator = #{item.creator,jdbcType=VARCHAR},
</if>
version = version + 1
</set>
where id = #{item.id,jdbcType=BIGINT}
</foreach>
</update>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
delete
from m_user
where id = #{id,jdbcType=BIGINT}
</delete>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long">
select
<include refid="Base_Column_List"/>
from m_user
where id = #{id,jdbcType=BIGINT}
</select>
<select id="queryCount" resultType="int" parameterType="com.secoo.mall.datasource.security.demo.bean.MUserCriteria">
select count(*)
from m_user
<include refid="Example_Where_Clause"></include>
</select>
<select id="queryList" resultMap="BaseResultMap" parameterType="com.secoo.mall.datasource.security.demo.bean.MUserCriteria">
select
<if test="fields != null and fields != ''">
${fields}
</if>
<if test="fields == null or fields == ''">
<include refid="Base_Column_List"/>
</if>
from m_user
<include refid="Example_Where_Clause"></include>
<if test="orderByClause != null">
order by ${orderByClause}
</if>
<if test="startIndex!=null and pageSize!=null and pageSize>0">
limit #{startIndex},#{pageSize}
</if>
</select>
</mapper>
\ No newline at end of file
package com.secoo.mall.datasource.security.filter; package com.secoo.mall.datasource.security.filter;
import com.alibaba.druid.filter.AutoLoad;
import com.secoo.mall.datasource.security.algorithm.property.PropertyProviderAlgorithm; import com.secoo.mall.datasource.security.algorithm.property.PropertyProviderAlgorithm;
import com.secoo.mall.datasource.security.config.DataSourceSecurityProperties; import com.secoo.mall.datasource.security.config.DataSourceSecurityProperties;
import com.secoo.mall.datasource.security.constant.PropertyProviderType; import com.secoo.mall.datasource.security.constant.PropertyProviderType;
import com.secoo.mall.datasource.security.exception.SecurityBizException; import com.secoo.mall.datasource.security.exception.SecurityBizException;
import com.secoo.mall.datasource.security.factory.SecurityAlgorithmFactory; import com.secoo.mall.datasource.security.factory.SecurityAlgorithmFactory;
import com.secoo.mall.datasource.security.rule.ColumnRule;
import com.secoo.mall.datasource.security.rule.DbRule; import com.secoo.mall.datasource.security.rule.DbRule;
import com.secoo.mall.datasource.security.rule.TableRule;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.Set; import java.util.Set;
@AutoLoad
public class SecurityFilterContext { public class SecurityFilterContext {
private static final Logger log = LoggerFactory.getLogger(SecurityFilterContext.class); private static final Logger log = LoggerFactory.getLogger(SecurityFilterContext.class);
private static final String DATASOURCE_SECURITY_PROPERTY_PROVIDER = "datasource.security.propertyProvider"; private static final String DATASOURCE_SECURITY_PROPERTY_PROVIDER_TYPE = "spring.datasource.security.propertyProviderType";
private static final String DEFAULT_PROPERTY_PROVIDER = PropertyProviderType.APOLLO;
private static class LazyHolder{ private Set<DbRule> dbRules;
private static final SecurityFilterContext INSTANCE = new SecurityFilterContext();
private Map<String,Map<String, Map<String, ColumnRule>>> dbRuleMap = new HashMap<>();
private final Map<String,String> dbUrlNameMap = new HashMap<>();
public Set<DbRule> getDbRules() {
return dbRules;
}
public void setDbRules(Set<DbRule> dbRules) {
this.dbRules = dbRules;
}
public SecurityFilterContext(String propertyProviderType){
this.init(propertyProviderType);
} }
public static SecurityFilterContext getInstance() { public Map<String,Map<String,ColumnRule>> getTableRuleMap(String dbName){
return LazyHolder.INSTANCE; if(dbName == null){
return null;
} }
public SecurityFilterContext(){ return this.dbRuleMap.get(dbName);
this.init();
} }
private void init(){ public ColumnRule getColumnRule(String dbName,String tableName,String columnName){
String propertyProvider = System.getProperty(DATASOURCE_SECURITY_PROPERTY_PROVIDER); if(tableName == null || columnName == null){
return null;
}
Map<String,Map<String,ColumnRule>> tableRuleMap = this.getTableRuleMap(dbName);
if(tableRuleMap == null || tableRuleMap.isEmpty()){
return null;
}
Map<String,ColumnRule> columnRuleMap = tableRuleMap.get(tableName);
if(columnRuleMap == null || columnRuleMap.isEmpty()){
return null;
}
return columnRuleMap.get(columnName);
}
public String getDbName(String url){
return this.dbUrlNameMap.get(url);
}
public void addDbName(String url,String dbName){
this.dbUrlNameMap.put(url,dbName);
}
private void init(String propertyProviderType){
String propertyProvider = propertyProviderType;
if(StringUtils.isBlank(propertyProvider)){
propertyProvider = System.getProperty(DATASOURCE_SECURITY_PROPERTY_PROVIDER_TYPE);
}
if(StringUtils.isBlank(propertyProvider)){ if(StringUtils.isBlank(propertyProvider)){
propertyProvider = System.getenv(DATASOURCE_SECURITY_PROPERTY_PROVIDER); propertyProvider = System.getenv(DATASOURCE_SECURITY_PROPERTY_PROVIDER_TYPE);
} }
// 默认apollo
if(StringUtils.isBlank(propertyProvider)){ if(StringUtils.isBlank(propertyProvider)){
propertyProvider =DEFAULT_PROPERTY_PROVIDER; propertyProvider =PropertyProviderType.APOLLO;
} }
PropertyProviderAlgorithm propertyProviderAlgorithm = SecurityAlgorithmFactory.getObject(PropertyProviderAlgorithm.class,propertyProvider,new Properties()); PropertyProviderAlgorithm propertyProviderAlgorithm = SecurityAlgorithmFactory.getObject(PropertyProviderAlgorithm.class,propertyProvider,new Properties());
DataSourceSecurityProperties dataSourceSecurityProperties = propertyProviderAlgorithm.load(); DataSourceSecurityProperties dataSourceSecurityProperties = propertyProviderAlgorithm.load();
...@@ -48,15 +93,51 @@ public class SecurityFilterContext { ...@@ -48,15 +93,51 @@ public class SecurityFilterContext {
throw new SecurityBizException("!!! Can not find security rules !!!"); throw new SecurityBizException("!!! Can not find security rules !!!");
} }
this.dbRules = dataSourceSecurityProperties.getRules(); this.dbRules = dataSourceSecurityProperties.getRules();
this.parseDbRules(this.dbRules);
} }
private Set<DbRule> dbRules; /**
* 解析规则
* @param dbRules
* @return
*/
private void parseDbRules(Set<DbRule> dbRules) {
if(dbRules == null || dbRules.isEmpty()){
return;
}
public Set<DbRule> getDbRules() { Map<String,Map<String,Map<String,ColumnRule>>> dbRuleMap = new HashMap<>();
return dbRules; for(DbRule dbRule:dbRules){
if(dbRule == null || dbRule.getDbName() == null || dbRule.getTableRules() == null || dbRule.getTableRules().isEmpty()){
continue;
} }
public void setDbRules(Set<DbRule> dbRules) { Map<String, Map<String, ColumnRule>> tableRuleMap = new HashMap<>();
this.dbRules = dbRules; for(TableRule tableRule:dbRule.getTableRules()){
if(tableRule == null || tableRule.getTableName() == null || tableRule.getColumnRules() == null || tableRule.getColumnRules().isEmpty()){
continue;
}
Map<String, ColumnRule> columnRuleMap = new HashMap<>();
for(ColumnRule columnRule:tableRule.getColumnRules()){
if(columnRule == null || columnRule.getLogicColumn() == null || columnRule.getCipherColumn() == null){
continue;
} }
columnRuleMap.put(columnRule.getLogicColumn(),columnRule);
}
if(!columnRuleMap.isEmpty()){
tableRuleMap.put(tableRule.getTableName(),columnRuleMap);
}
}
if(!tableRuleMap.isEmpty()){
dbRuleMap.put(dbRule.getDbName(),tableRuleMap);
}
}
this.dbRuleMap = dbRuleMap;
}
} }
package com.secoo.mall.datasource.security.visitor;
public class Column {
private String tableName;
private String columnAlias;
private String columnName;
public Column(String tableName, String columnAlias, String columnName) {
this.tableName = tableName;
this.columnAlias = columnAlias;
this.columnName = columnName;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getColumnAlias() {
return columnAlias;
}
public void setColumnAlias(String columnAlias) {
this.columnAlias = columnAlias;
}
public String getColumnName() {
return columnName;
}
public void setColumnName(String columnName) {
this.columnName = columnName;
}
@Override
public String toString() {
return "Column{" +
"tableName='" + tableName + '\'' +
", columnAlias='" + columnAlias + '\'' +
", columnName='" + columnName + '\'' +
'}';
}
}
package com.secoo.mall.datasource.security.visitor;
import com.secoo.mall.datasource.security.rule.ColumnRule;
public class Parameter {
private String tableName;
private String columnAlias;
private String columnName;
private int jdbcIndex;
private Object value;
private ColumnRule columnRule;
public Parameter(String tableName, String columnAlias, String columnName, int jdbcIndex, Object value,ColumnRule columnRule) {
this.tableName = tableName;
this.columnAlias = columnAlias;
this.columnName = columnName;
this.jdbcIndex = jdbcIndex;
this.value = value;
this.columnRule = columnRule;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getColumnAlias() {
return columnAlias;
}
public void setColumnAlias(String columnAlias) {
this.columnAlias = columnAlias;
}
public String getColumnName() {
return columnName;
}
public void setColumnName(String columnName) {
this.columnName = columnName;
}
public int getJdbcIndex() {
return jdbcIndex;
}
public void setJdbcIndex(int jdbcIndex) {
this.jdbcIndex = jdbcIndex;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public ColumnRule getColumnRule() {
return columnRule;
}
public void setColumnRule(ColumnRule columnRule) {
this.columnRule = columnRule;
}
@Override
public String toString() {
return "Parameter{" +
"tableName='" + tableName + '\'' +
", columnAlias='" + columnAlias + '\'' +
", columnName='" + columnName + '\'' +
", jdbcIndex=" + jdbcIndex +
", value=" + value +
", columnRule=" + columnRule +
'}';
}
}
package com.secoo.mall.datasource.security.visitor;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter;
public class ParameterVisitor extends MySqlASTVisitorAdapter {
}
package com.secoo.mall.datasource.security;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.dialect.hive.visitor.HiveASTVisitorAdapter;
import com.alibaba.druid.util.JdbcConstants;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class ExportTableAliasVisitor extends HiveASTVisitorAdapter {
private static ThreadLocal<String> dbName = new ThreadLocal<>();
public void set(String s) {
dbName.set(s);
}
public void remove() {
dbName.remove();
}
@Override
public boolean visit(SQLExprTableSource x) {
//别名,如果有别名,别名保持不变
String s = StringUtils.isEmpty(x.getAlias()) ? x.getExpr().toString() : x.getAlias();
// 修改表名,不包含点才加 select id from c left join d on c.id = d.id 中的c 和 d
if(!x.getExpr().toString().contains(".")) {
x.setExpr("`" + dbName.get() + "`." + x.getExpr());
}
x.setAlias(s);
return true;
}
public static void main(String[] args) {
List<String> list = new ArrayList<>();
String s0 = "select id from a";
String s1 = "select a.id from a,b where a.id = b.id";
String s2 = "select a.name from a left join b on a.id = b.id";
String s3 = "select a.name from a t1 left join b t2 on t1.id = t2.id";
String s4 = "select t.name from (select a.name from a left join b on a.id = b.id) t";
list.add(s0);
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
String dbType = JdbcConstants.HIVE;
int i = 0;
for (String sql : list) {
System.out.println(i++);
System.out.println(sql);
ExportTableAliasVisitor visitor = new ExportTableAliasVisitor();
visitor.set("d");
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
for (SQLStatement stmt : stmtList) {
stmt.accept(visitor);
}
String s = SQLUtils.toSQLString(stmtList, dbType);
visitor.remove();
System.out.println(s);
}
}
}
...@@ -7,25 +7,23 @@ import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; ...@@ -7,25 +7,23 @@ import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlSelectIntoStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; import com.alibaba.fastjson.JSON;
import com.alibaba.druid.stat.TableStat; import com.secoo.mall.datasource.security.visitor.MySqlSecurityParameterVisitor;
import com.secoo.mall.datasource.security.rule.ColumnRule; import com.secoo.mall.datasource.security.visitor.Parameter;
import org.apache.commons.collections.CollectionUtils;
import java.util.Collection; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
public class SQLParserTest { public class SQLParserTest {
public static void testVisitor(){ public static void testVisitor(){
String sql = "select u.name,a.age from t_user u,t_account a where u.id = a.id and t_account.id > 12 and a.age >? order by id desc;"; // String sql = "select u.name,a.age from t_user u,t_account a where u.id = a.id and u.id > 12 and u.height between ? and ? and t_account.age >? and a.name in('tom', ? ,'john') order by id desc;";
// String sql = "select secooStoreDB.t_sequence.`code` from secooStoreDB.t_sequence,secooStoreDB.t_store_fail_mq where secooStoreDB.t_sequence.`code`=secooStoreDB.t_store_fail_mq.topic"; // String sql = "select secooStoreDB.t_sequence.`code` from secooStoreDB.t_sequence,secooStoreDB.t_store_fail_mq where secooStoreDB.t_sequence.`code`=secooStoreDB.t_store_fail_mq.topic";
// String sql = "delete from t_sequence"; // String sql = "delete from t_sequence";
// String sql = "INSERT INTO `secooStoreDB`.`t_sequence`(`t_sequence`.`name`, `current_value`, `increment`, `code`) VALUES (?, 4551, 1, 2),('t_store_category', 65015, 1, 1);"; String sql = "INSERT INTO `secooStoreDB`.`t_sequence`(`secooStoreDB`.`t_sequence`.`name`, `t_sequence`.`current_value`, `increment`, `code`) VALUES (?, 4551, 1, 2),('t_store_category', ?, 1, ?);";
// String sql = "INSERT INTO `secooStoreDB`.`t_sequence` VALUES ('t_store', 4551, 1, 2),('t_store_category', 65015, 1, 1)"; // String sql = "INSERT INTO `secooStoreDB`.`t_sequence` VALUES ('t_store', 4551, 1, 2),('t_store_category', 65015, 1, 1)";
// String sql = "update t_user set name=?,age=10 where id = id and id > 12"; // String sql = "update t_user set name=?,age=10 where id = id and id > 12";
// String sql = "update t_user u,t_account a set u.name=?,a.age=10 where u.id = a.id and u.id > 12 and a.age >?"; // String sql = "update t_user u,t_account a set u.name=?,a.age=10 where u.id = a.id and u.id > 12 and a.age >?";
...@@ -35,17 +33,25 @@ public class SQLParserTest { ...@@ -35,17 +33,25 @@ public class SQLParserTest {
// 解析sql // 解析sql
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql,"mysql"); List<SQLStatement> stmtList = SQLUtils.parseStatements(sql,"mysql");
for (SQLStatement stmt : stmtList) { for (SQLStatement stmt : stmtList) {
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); // List<Parameter> params = new ArrayList<>();
stmt.accept(visitor); // ParameterVisitor visitor = new ParameterVisitor(params);
System.out.println(visitor.getParameters()); // MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
List<Parameter> encryptColumnParameters = new ArrayList<>();
MySqlSecurityParameterVisitor visitor = new MySqlSecurityParameterVisitor(null,encryptColumnParameters);
stmt.accept(visitor);
System.out.println("encryptColumnParameters=" + JSON.toJSONString(encryptColumnParameters));
// System.out.println(visitor.getParameters());
if(CollectionUtils.isNotEmpty(encryptColumnParameters)){
return;
}
if (stmt instanceof SQLSelectStatement) { if (stmt instanceof SQLSelectStatement) {
SQLSelectStatement selectStmt = (SQLSelectStatement) stmt; SQLSelectStatement selectStmt = (SQLSelectStatement) stmt;
System.out.println(visitor.getColumns());
// System.out.println(selectStmt.getSelect().getQueryBlock().removeCondition("t_account.id > 12")); // System.out.println(selectStmt.getSelect().getQueryBlock().removeCondition("t_account.id > 12"));
System.out.println(selectStmt.toString()); System.out.println(selectStmt.toString());
System.out.println(selectStmt.getSelect().getQueryBlock().getSelectList()); System.out.println(selectStmt.getSelect().getQueryBlock().getSelectList());
System.out.println(selectStmt.getSelect().getQueryBlock().getWhere()); System.out.println(selectStmt.getSelect().getQueryBlock().getWhere());
// System.out.println(visitor.getConditions());
System.out.println("---"); System.out.println("---");
}else if(stmt instanceof MySqlDeleteStatement){ }else if(stmt instanceof MySqlDeleteStatement){
MySqlDeleteStatement deleteStmt = (MySqlDeleteStatement) stmt; MySqlDeleteStatement deleteStmt = (MySqlDeleteStatement) stmt;
...@@ -54,12 +60,7 @@ public class SQLParserTest { ...@@ -54,12 +60,7 @@ public class SQLParserTest {
MySqlInsertStatement insertStmt = (MySqlInsertStatement) stmt; MySqlInsertStatement insertStmt = (MySqlInsertStatement) stmt;
String tableName = insertStmt.getTableName().getSimpleName(); String tableName = insertStmt.getTableName().getSimpleName();
int valuesSize = insertStmt.getValuesList().size();
Collection<TableStat.Column> columns = visitor.getColumns();
int columnSize = columns.size();
for (TableStat.Column column : columns) {
System.out.println(column.getTable());
}
System.out.println("---"); System.out.println("---");
}else if(stmt instanceof MySqlUpdateStatement){ }else if(stmt instanceof MySqlUpdateStatement){
MySqlUpdateStatement updateStmt = (MySqlUpdateStatement) stmt; MySqlUpdateStatement updateStmt = (MySqlUpdateStatement) stmt;
......
package com.secoo.mall.datasource.security;
import com.alibaba.druid.filter.FilterEventAdapter;
public class TestFilter extends FilterEventAdapter {
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment