Skip to content

Commit 69e29b1

Browse files
authored
Mongo返回结果支持脱敏-V0.1-beta (#2884)
* 返回一个脱敏后的结果集 * 通过goInception获取select list * test_query_masking * test_query_masking * 8889 * 18888888889
1 parent 1940735 commit 69e29b1

File tree

3 files changed

+58
-6
lines changed

3 files changed

+58
-6
lines changed

sql/engines/mongo.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
from bson.objectid import ObjectId
1616
from bson.int64 import Int64
1717

18+
from sql.utils.data_masking import data_masking
19+
1820
from . import EngineBase
1921
from .models import ResultSet, ReviewSet, ReviewResult
2022
from common.config import SysConfig
@@ -1422,3 +1424,9 @@ def reset_instance_user_pwd(self, db_name_user: str, reset_pwd: str, **kwargs):
14221424
except Exception as e:
14231425
exec_result.error = str(e)
14241426
return exec_result
1427+
1428+
def query_masking(self, db_name=None, sql="", resultset=None):
1429+
"""传入 sql语句, db名, 结果集,
1430+
返回一个脱敏后的结果集"""
1431+
mask_result = data_masking(self.instance, db_name, sql, resultset)
1432+
return mask_result

sql/engines/tests.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from sql.engines.mongo import MongoEngine
1818
from sql.engines.clickhouse import ClickHouseEngine
1919
from sql.engines.odps import ODPSEngine
20-
from sql.models import Instance, SqlWorkflow, SqlWorkflowContent
20+
from sql.models import DataMaskingColumns, Instance, SqlWorkflow, SqlWorkflowContent
2121

2222
User = get_user_model()
2323

@@ -1665,9 +1665,19 @@ def setUp(self) -> None:
16651665
)
16661666
self.engine = MongoEngine(instance=self.ins)
16671667
self.sys_config = SysConfig()
1668+
# rule_type=100的规则不需要加,会自动创建。只需要加脱敏字段
1669+
DataMaskingColumns.objects.create(
1670+
rule_type=100,
1671+
active=True,
1672+
instance=self.ins,
1673+
table_schema="*",
1674+
table_name="*",
1675+
column_name="mobile",
1676+
)
16681677

16691678
def tearDown(self) -> None:
16701679
self.ins.delete()
1680+
DataMaskingColumns.objects.all().delete()
16711681

16721682
@patch("sql.engines.mongo.pymongo")
16731683
def test_get_connection(self, mock_pymongo):
@@ -2042,6 +2052,27 @@ def test_create_instance_user(self, _mock_command):
20422052
],
20432053
)
20442054

2055+
def test_query_masking(self):
2056+
query_result = ResultSet()
2057+
new_engine = MongoEngine(instance=self.ins)
2058+
query_result.column_list = ["id", "mobile"]
2059+
query_result.rows = (
2060+
("a11", "18888888888"),
2061+
("a12", ""),
2062+
("a13", None),
2063+
("a14", "18888888889"),
2064+
)
2065+
masking_result = new_engine.query_masking(
2066+
db_name="archery", sql="db.test_collection.find()", resultset=query_result
2067+
)
2068+
mask_result_rows = [
2069+
["a11", "188****8888"],
2070+
["a12", ""],
2071+
["a13", None],
2072+
["a14", "188****8889"],
2073+
]
2074+
self.assertEqual(masking_result.rows, mask_result_rows)
2075+
20452076

20462077
class TestClickHouse(TestCase):
20472078
def setUp(self):

sql/utils/data_masking.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,24 @@ def data_masking(instance, db_name, sql, sql_result):
2424
for token in p.tokens:
2525
if token.ttype is Keyword and token.value.upper() in ["UNION", "UNION ALL"]:
2626
keywords_count["UNION"] = keywords_count.get("UNION", 0) + 1
27-
# 通过goInception获取select list
28-
inception_engine = GoInceptionEngine()
29-
select_list = inception_engine.query_data_masking(
30-
instance=instance, db_name=db_name, sql=sql
31-
)
27+
if instance.db_type == "mongo":
28+
select_list = [
29+
{
30+
"index": index,
31+
"field": field,
32+
"type": "varchar",
33+
"table": "*",
34+
"schema": db_name,
35+
"alias": field,
36+
}
37+
for index, field in enumerate(sql_result.column_list)
38+
]
39+
else:
40+
# 通过goInception获取select list
41+
inception_engine = GoInceptionEngine()
42+
select_list = inception_engine.query_data_masking(
43+
instance=instance, db_name=db_name, sql=sql
44+
)
3245
# 如果UNION存在,那么调用去重函数
3346
select_list = (
3447
del_repeat(select_list, keywords_count) if keywords_count else select_list

0 commit comments

Comments
 (0)