Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
matrix
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
CI / CD
CI / CD
Pipelines
Schedules
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
mall
arch
matrix
Commits
4cf0013f
Commit
4cf0013f
authored
Sep 02, 2021
by
郑冰晶
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
数据库加密组件
parent
b554ed75
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
83 additions
and
61 deletions
+83
-61
MySqlSecurityParameterVisitor.java
matrix-datasource/matrix-datasource-security/matrix-datasource-security-druid/src/main/java/com/secoo/mall/datasource/security/visitor/MySqlSecurityParameterVisitor.java
+83
-61
No files found.
matrix-datasource/matrix-datasource-security/matrix-datasource-security-druid/src/main/java/com/secoo/mall/datasource/security/visitor/MySqlSecurityParameterVisitor.java
View file @
4cf0013f
...
...
@@ -98,90 +98,112 @@ public class MySqlSecurityParameterVisitor extends MySqlSchemaStatVisitor {
return
true
;
}
this
.
encryptColumnParameters
.
add
(
new
Parameter
(
column
.
getTableName
(),
column
.
getColumnAlias
(),
column
.
getColumnName
(),
x
.
getIndex
(),
x
.
getName
(),
columnRule
));
this
.
encryptColumnParameters
.
add
(
new
Parameter
(
column
,
x
.
getName
(),
x
.
getIndex
(),
columnRule
,
null
));
return
true
;
}
public
boolean
visit
(
SQLInsertStatement
x
)
{
String
tableName
=
x
.
getTableName
().
getSimpleName
();
public
boolean
visit
(
MySqlInsertStatement
x
)
{
if
(
repository
!=
null
&&
x
.
getParent
()
==
null
)
{
repository
.
resolve
(
x
);
}
accept
(
x
.
getColumns
());
accept
(
x
.
getValuesList
());
accept
(
x
.
getQuery
());
accept
(
x
.
getDuplicateKeyUpdate
());
List
<
SQLExpr
>
columns
=
x
.
getColumns
();
Map
<
Integer
,
Column
>
columnMap
=
new
HashMap
<>();
// 插入sql不能省略列名
if
(!
columns
.
isEmpty
()){
for
(
int
i
=
0
;
i
<
columns
.
size
();
i
++){
SQLExpr
columnSQLExpr
=
columns
.
get
(
i
);
String
columnName
=
null
;
if
(
columnSQLExpr
instanceof
SQLIdentifierExpr
){
SQLIdentifierExpr
columnSQLIdentifierExpr
=
(
SQLIdentifierExpr
)
columnSQLExpr
;
columnName
=
columnSQLIdentifierExpr
.
getName
();
}
else
if
(
columnSQLExpr
instanceof
SQLPropertyExpr
){
SQLPropertyExpr
columnSQLPropertyExpr
=
(
SQLPropertyExpr
)
columnSQLExpr
;
columnName
=
columnSQLPropertyExpr
.
getName
();
}
List
<
SQLExpr
>
columns
=
x
.
getColumns
();
if
(
columns
.
isEmpty
()){
return
true
;
}
Column
column
=
new
Column
(
tableName
,
""
,
columnName
);
columnMap
.
put
(
i
,
column
);
String
tableName
=
x
.
getTableName
().
getSimpleName
();
// columns
Map
<
Integer
,
Column
>
columnMap
=
new
HashMap
<>();
for
(
int
i
=
0
;
i
<
columns
.
size
();
i
++){
SQLExpr
columnSQLExpr
=
columns
.
get
(
i
);
String
columnName
=
null
;
if
(
columnSQLExpr
instanceof
SQLIdentifierExpr
){
SQLIdentifierExpr
columnSQLIdentifierExpr
=
(
SQLIdentifierExpr
)
columnSQLExpr
;
columnName
=
columnSQLIdentifierExpr
.
getName
();
}
else
if
(
columnSQLExpr
instanceof
SQLPropertyExpr
){
SQLPropertyExpr
columnSQLPropertyExpr
=
(
SQLPropertyExpr
)
columnSQLExpr
;
columnName
=
columnSQLPropertyExpr
.
getName
();
}
List
<
MySqlInsertStatement
.
ValuesClause
>
valuesClauses
=
x
.
getValuesList
();
for
(
SQLInsertStatement
.
ValuesClause
valuesClause:
valuesClauses
){
List
<
SQLExpr
>
values
=
valuesClause
.
getValues
();
for
(
int
columnIndex
=
0
;
columnIndex
<
values
.
size
();
columnIndex
++){
SQLExpr
valueSQLExpr
=
values
.
get
(
columnIndex
);
if
(!(
valueSQLExpr
instanceof
SQLVariantRefExpr
))
{
// ?
continue
;
}
SQLVariantRefExpr
variantRefExpr
=
(
SQLVariantRefExpr
)
valueSQLExpr
;
if
(!
Token
.
QUES
.
name
.
equals
(
variantRefExpr
.
getName
())){
continue
;
}
Column
column
=
new
Column
(
tableName
,
""
,
columnName
,
""
,
null
);
columnMap
.
put
(
i
,
column
);
}
Column
column
=
columnMap
.
get
(
columnIndex
);
if
(
column
==
null
){
continue
;
}
// values
List
<
MySqlInsertStatement
.
ValuesClause
>
valuesClauses
=
x
.
getValuesList
();
for
(
SQLInsertStatement
.
ValuesClause
valuesClause:
valuesClauses
){
List
<
SQLExpr
>
values
=
valuesClause
.
getValues
();
for
(
int
columnIndex
=
0
;
columnIndex
<
values
.
size
();
columnIndex
++){
SQLExpr
valueSQLExpr
=
values
.
get
(
columnIndex
);
if
(!(
valueSQLExpr
instanceof
SQLVariantRefExpr
))
{
// ?
continue
;
}
SQLVariantRefExpr
variantRefExpr
=
(
SQLVariantRefExpr
)
valueSQLExpr
;
if
(!
Token
.
QUES
.
name
.
equals
(
variantRefExpr
.
getName
())){
continue
;
}
ColumnRule
columnRule
=
this
.
getColumnRule
(
column
.
getTableName
(),
column
.
getColumnName
());
if
(
columnRule
==
null
){
return
true
;
}
Parameter
parameter
=
new
Parameter
(
column
.
getTableName
(),
column
.
getColumnAlias
(),
column
.
getColumnName
(),
variantRefExpr
.
getIndex
(),
variantRefExpr
.
getName
(),
columnRule
);
this
.
encryptColumnParameters
.
add
(
parameter
);
Column
column
=
columnMap
.
get
(
columnIndex
);
if
(
column
==
null
){
continue
;
}
ColumnRule
columnRule
=
this
.
getColumnRule
(
column
.
getTableName
(),
column
.
getColumnName
());
if
(
columnRule
==
null
){
return
true
;
}
Parameter
parameter
=
new
Parameter
(
column
,
variantRefExpr
.
getName
(),
variantRefExpr
.
getIndex
(),
columnRule
,
null
);
this
.
encryptColumnParameters
.
add
(
parameter
);
}
}
return
true
;
}
// duplicateKeyUpdate
List
<
SQLExpr
>
duplicateKeyUpdate
=
x
.
getDuplicateKeyUpdate
();
for
(
int
i
=
0
;
i
<
duplicateKeyUpdate
.
size
();
i
++){
SQLExpr
sqlExpr
=
duplicateKeyUpdate
.
get
(
i
);
if
(!(
sqlExpr
instanceof
SQLBinaryOpExpr
)){
sqlExpr
.
accept
(
this
);
continue
;
}
SQLBinaryOpExpr
sqlBinaryOpExpr
=
(
SQLBinaryOpExpr
)
sqlExpr
;
public
void
endVisit
(
SQLInsertStatement
x
)
{
// TODO 根据待增加的明文参数信息,增加明文列
SQLExpr
left
=
sqlBinaryOpExpr
.
getLeft
();
SQLExpr
right
=
sqlBinaryOpExpr
.
getRight
();
if
(!(
right
instanceof
SQLVariantRefExpr
))
{
// ?
continue
;
}
SQLVariantRefExpr
variantRefExpr
=
(
SQLVariantRefExpr
)
right
;
if
(!
Token
.
QUES
.
name
.
equals
(
variantRefExpr
.
getName
())){
continue
;
}
}
Column
column
=
this
.
getMySqlColumn
(
left
);
if
(
column
==
null
){
continue
;
}
public
boolean
visit
(
SQLSelectItem
x
)
{
SQLExpr
sqlExpr
=
x
.
getExpr
();
return
tr
ue
;
}
ColumnRule
columnRule
=
this
.
getColumnRule
(
column
.
getTableName
(),
column
.
getColumnName
());
if
(
columnRule
==
null
){
contin
ue
;
}
this
.
encryptColumnParameters
.
add
(
new
Parameter
(
column
,
variantRefExpr
.
getName
(),
variantRefExpr
.
getIndex
(),
columnRule
,
null
));
}
public
boolean
visit
(
SQLUpdateSetItem
x
)
{
// TODO 如果是逻辑列,替换为加密列,修改加密参数;如果有明文列,同时记录增加的明文参数信息
return
true
;
}
/**
* 增加明文列
* @param x
*/
public
void
endVisit
(
SQLUpdateStatement
x
)
{
// TODO 根据待增加的明文参数信息,增加明文列
}
/**
* 加密规则
* @param tableName
* @param columnName
...
...
@@ -261,7 +283,7 @@ public class MySqlSecurityParameterVisitor extends MySqlSchemaStatVisitor {
return
null
;
}
return
new
Column
(
tableName
.
toString
(),
""
,
columnName
);
return
new
Column
(
tableName
,
""
,
columnName
,
""
,
null
);
}
private
SQLExpr
unwrapExpr
(
SQLExpr
expr
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment