Skip to content

Commit 5174743

Browse files
authored
Merge pull request #2 from yanghongfei/master
[Add]新增CMDB基于标签对普通用户做权限
2 parents 541f0a6 + a895bf8 commit 5174743

File tree

9 files changed

+1063
-69
lines changed

9 files changed

+1063
-69
lines changed

biz/handlers/asset_db_handler.py

Lines changed: 98 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
from websdk.db_context import DBContext
1515
import tornado.web
1616

17+
1718
class DBHandler(BaseHandler):
1819
def get(self, *args, **kwargs):
20+
nickname = self.get_current_nickname()
1921
key = self.get_argument('key', default=None, strip=True)
2022
value = self.get_argument('value', default=None, strip=True)
2123
page_size = self.get_argument('page', default=1, strip=True)
@@ -45,28 +47,66 @@ def get(self, *args, **kwargs):
4547

4648
### 监听搜索
4749
if key and key != 'tag_name' and not value:
48-
count = session.query(DB).filter(or_(DB.db_code.like('%{}%'.format(key)),
49-
DB.db_host.like('%{}%'.format(key)),
50-
DB.db_user.like('%{}%'.format(key)),
51-
DB.db_pwd.like('%{}%'.format(key)),
52-
DB.proxy_host.like('%{}%'.format(key)),
53-
DB.db_type.like('%{}%'.format(key)),
54-
DB.db_version.like('%{}%'.format(key)),
55-
DB.db_mark.like('%{}%'.format(key)),
56-
DB.state.like('%{}%'.format(key)),
57-
DB.db_env.like('%{}%'.format(key)))).count()
58-
59-
db_info = session.query(DB).filter(or_(DB.db_code.like('%{}%'.format(key)),
60-
DB.db_host.like('%{}%'.format(key)),
61-
DB.db_user.like('%{}%'.format(key)),
62-
DB.db_pwd.like('%{}%'.format(key)),
63-
DB.proxy_host.like('%{}%'.format(key)),
64-
DB.db_type.like('%{}%'.format(key)),
65-
DB.db_version.like('%{}%'.format(key)),
66-
DB.db_mark.like('%{}%'.format(key)),
67-
DB.state.like('%{}%'.format(key)),
68-
DB.db_env.like('%{}%'.format(key)))).order_by(DB.id).offset(
69-
limit_start).limit(int(limit))
50+
# TODO 超管查所有
51+
if self.is_superuser:
52+
53+
count = session.query(DB).filter(or_(DB.db_code.like('%{}%'.format(key)),
54+
DB.db_host.like('%{}%'.format(key)),
55+
DB.db_user.like('%{}%'.format(key)),
56+
DB.db_pwd.like('%{}%'.format(key)),
57+
DB.proxy_host.like('%{}%'.format(key)),
58+
DB.db_type.like('%{}%'.format(key)),
59+
DB.db_version.like('%{}%'.format(key)),
60+
DB.db_mark.like('%{}%'.format(key)),
61+
DB.state.like('%{}%'.format(key)),
62+
DB.db_env.like('%{}%'.format(key)))).count()
63+
64+
db_info = session.query(DB).filter(or_(DB.db_code.like('%{}%'.format(key)),
65+
DB.db_host.like('%{}%'.format(key)),
66+
DB.db_user.like('%{}%'.format(key)),
67+
DB.db_pwd.like('%{}%'.format(key)),
68+
DB.proxy_host.like('%{}%'.format(key)),
69+
DB.db_type.like('%{}%'.format(key)),
70+
DB.db_version.like('%{}%'.format(key)),
71+
DB.db_mark.like('%{}%'.format(key)),
72+
DB.state.like('%{}%'.format(key)),
73+
DB.db_env.like('%{}%'.format(key)))).order_by(DB.id).offset(
74+
limit_start).limit(int(limit))
75+
76+
else:
77+
# TODO 普通用户只能看到有权限的
78+
db_id_list = []
79+
with DBContext('r') as session:
80+
the_dbs = session.query(DBTag.db_id).filter(DBTag.tag_id.in_(
81+
session.query(Tag.id).filter(or_(Tag.users.like('%{}%'.format(nickname))))))
82+
for s in the_dbs:
83+
db_id_list.append(s[0])
84+
# 去重下列表,万一有重复的呢
85+
set_db_id_list = set(db_id_list)
86+
count = session.query(DB).filter(DB.id.in_(set_db_id_list)).filter(
87+
or_(DB.db_code.like('%{}%'.format(key)),
88+
DB.db_host.like('%{}%'.format(key)),
89+
DB.db_user.like('%{}%'.format(key)),
90+
DB.db_pwd.like('%{}%'.format(key)),
91+
DB.proxy_host.like('%{}%'.format(key)),
92+
DB.db_type.like('%{}%'.format(key)),
93+
DB.db_version.like('%{}%'.format(key)),
94+
DB.db_mark.like('%{}%'.format(key)),
95+
DB.state.like('%{}%'.format(key)),
96+
DB.db_env.like('%{}%'.format(key)))).count()
97+
98+
db_info = session.query(DB).filter(DB.id.in_(set_db_id_list)).filter(
99+
or_(DB.db_code.like('%{}%'.format(key)),
100+
DB.db_host.like('%{}%'.format(key)),
101+
DB.db_user.like('%{}%'.format(key)),
102+
DB.db_pwd.like('%{}%'.format(key)),
103+
DB.proxy_host.like('%{}%'.format(key)),
104+
DB.db_type.like('%{}%'.format(key)),
105+
DB.db_version.like('%{}%'.format(key)),
106+
DB.db_mark.like('%{}%'.format(key)),
107+
DB.state.like('%{}%'.format(key)),
108+
DB.db_env.like('%{}%'.format(key)))).order_by(DB.id).offset(
109+
limit_start).limit(int(limit))
70110

71111
for msg in db_info:
72112
tag_list = []
@@ -86,13 +126,38 @@ def get(self, *args, **kwargs):
86126
count = session.query(DB).count()
87127
db_info = session.query(DB).order_by(DB.id).all()
88128
else:
89-
if key and value:
90-
count = session.query(DB).filter_by(**{key: value}).count()
91-
db_info = session.query(DB).filter_by(**{key: value}).order_by(DB.id).offset(limit_start).limit(
92-
int(limit))
129+
# TODO 超管查所有
130+
if self.is_superuser:
131+
if key and value:
132+
count = session.query(DB).filter_by(**{key: value}).count()
133+
db_info = session.query(DB).filter_by(**{key: value}).order_by(DB.id).offset(limit_start).limit(
134+
int(limit))
135+
else:
136+
count = session.query(DB).count()
137+
db_info = session.query(DB).order_by(DB.id).offset(limit_start).limit(int(limit))
93138
else:
94-
count = session.query(DB).count()
95-
db_info = session.query(DB).order_by(DB.id).offset(limit_start).limit(int(limit))
139+
# TODO 普通用户只给有权限的DB,根据用户查Tagid, 根据Tagid查询出来关联的DBID,根据DBID返回主机详情
140+
db_id_list = []
141+
with DBContext('r') as session:
142+
# 子查询查出来server_id
143+
the_dbs = session.query(DBTag.db_id).filter(DBTag.tag_id.in_(
144+
session.query(Tag.id).filter(or_(Tag.users.like('%{}%'.format(nickname))))))
145+
for d in the_dbs:
146+
db_id_list.append(d[0])
147+
# 去重下列表,万一有重复的呢
148+
set_db_id_list = set(db_id_list)
149+
if key and value:
150+
# 根据Keyvalue获取
151+
count = session.query(DB).filter(DB.id.in_(set_db_id_list)).filter_by(
152+
**{key: value}).count()
153+
db_info = session.query(DB).filter(DB.id.in_(set_db_id_list)).filter_by(
154+
**{key: value}).order_by(DB.id).offset(
155+
limit_start).limit(int(limit))
156+
else:
157+
# 获取主机详情
158+
count = session.query(DB).filter(DB.id.in_(set_db_id_list)).count()
159+
db_info = session.query(DB).filter(DB.id.in_(set_db_id_list)).offset(
160+
limit_start).limit(int(limit))
96161

97162
for msg in db_info:
98163
tag_list = []
@@ -127,14 +192,16 @@ def post(self, *args, **kwargs):
127192
with DBContext('r') as session:
128193
exist_id = session.query(DB.id).filter(DB.db_code == db_code, DB.db_host == db_host, DB.db_port == db_port,
129194
DB.db_user == db_user, DB.db_env == db_env,
130-
DB.proxy_host == proxy_host, DB.db_type == db_type,db_version == db_version,
195+
DB.proxy_host == proxy_host, DB.db_type == db_type,
196+
db_version == db_version,
131197
DB.db_mark == db_mark).first()
132198
if exist_id:
133199
return self.write(dict(code=-2, msg='不要重复记录'))
134200

135201
with DBContext('w', None, True) as session:
136202
new_db = DB(db_code=db_code, db_host=db_host, db_port=db_port, db_user=db_user, db_pwd=db_pwd,
137-
db_env=db_env, proxy_host=proxy_host, db_type=db_type, db_version=db_version, db_mark=db_mark, db_detail=db_detail)
203+
db_env=db_env, proxy_host=proxy_host, db_type=db_type, db_version=db_version, db_mark=db_mark,
204+
db_detail=db_detail)
138205
session.add(new_db)
139206

140207
all_tags = session.query(Tag.id).filter(Tag.tag_name.in_(tag_list)).order_by(Tag.id).all()
@@ -200,4 +267,4 @@ def delete(self, *args, **kwargs):
200267
(r"/v1/cmdb/db/", DBHandler)
201268
]
202269
if __name__ == "__main__":
203-
pass
270+
pass

0 commit comments

Comments
 (0)