目标
权限管理是企业实现安全管理的必要因素,如何设计权限控制让员工在不越界的情况下还能自由发挥是权限管理系统设计的难题。
资金充足的企业往往会选择购买市场上OA系统,每年付费几十万,省去了设计维护系统之余,还提高了员工的办公效率。主流的OA系统有泛微的e-cology。
而对于一些私企,往往会选择自己搭建系统网站,每年省下一大笔支出,同时还保护了公司的商业机密。而这样这些网站,往往需要开发工程师设计一个合理实用的权限管理系统。
而本文将基于自定义权限编码设计树状权限管理系统,给公司网页各功能进行权限的编码,并给员工授予相应的权限编码,实现了权限的严格且合理的划分,管理员更为便利地给各部门员工授权。
权限编码
本文基于python字典格式设计了一款编码,可以将树状的权限以字典的形式进行编码,同时通过解析字典来解码,获取相应的权限信息。
树状字典
首先将树状权限转换成python字典,以字典包含字典的方法实现树状结构。
num = {
'运营': {
'数据库': {
'运营数据库': 0,
'产品数据库': {
'产品查询': 0,
'下单价格': 0
}
},
'数据分析':0,
'订单管理':{
'订单文件': 0
}
},
'人事': {
'数据库': {
'人事数据库': {
'员工信息': 0,
'人事结构': 0
},
},
'数据分析':{
'打卡出勤': 0,
'绩效': 0
},
'订单管理':0
}
}
转换数字字典,便于数据存储和解码。可以看到,以权限的先后顺序进行1,2,3,…编码。比如在一层中,部门以1,2分别表示运营和人事。而在第二层中,以1,2,3分别表示数据库,数据分析和订单管理这三个大权限。而后面的小权限也依次以数字进行表示。
下面的num字典为具备所有权限的编码。
而user_code字典为只具备运营的部分权限的编码,且不具备查看订单文件的权限。说明权限限制可以通过直接删除那里的字典,或者让字典的值为0,来达到权限限制。
num = {
'1': {
'1': {
'1': 0,
'2': {
'1': 0,
'2': 0
}
},
'2':0,
'3':{
'1': 0
}
},
'2': {
'1': {
'1': {
'1': 0,
'2': 0
},
},
'2':{
'1': 0,
'2': 0
},
'3':0
}
}
user_code = {
'1': {
'1': {
'1': 0,
'2': {
'1': 0,
'2': 0
}
},
'2':0,
'3':0
}
}
权限解码
权限列表
要实现权限解码,需要建立权限列表,列表里面存放相应的权限函数。比如’database’, ‘analysis’, 'order’等,这些权限函数可以是页面对应的后端函数,执行函数前先进行权限判断,从而使用权限的管理。
权限列表的命名需严格规范,比如list_0_1_1_2 表示运营1-数据库1-产品数据库2里面的函数,有’search’, ‘price’ 根据编码好的树状字典,编写权限列表。解码的时候,便根据编码解码,得到该员工所拥有的权限函数。
list_0 = ['', '']
list_0_1 = ['database', 'analysis', 'order']
list_0_1_1 = ['operational_database', 'product_database']
list_0_1_1_2 = ['search', 'price']
list_0_1_3 = ['订单文件']
list_0_1_3 = ['file']
list_0_2 = ['database', 'analysis', 'order']
list_0_2_1 = ['人事数据库']
list_0_2_1 = ['hr_database']
list_0_2_1_1 = ['staff', 'personnel']
nist_0_2_2 = ['打卡出勤', '绩效']
list_0_2_2 = ['card', 'achievements']
解码
这里是根据获取的权限编码,逐层解码
for key0 in dict0.keys():
a1 = key0
pm1 = locals()['list_0'.format(a1)][int(a1) - 1]
permission_list.append(pm1)
if (dict0[a1] != 0):
dict1 = dict0[a1]
for key1 in dict1.keys():
a2 = key1
pm1 = locals()['list_0_{}'.format(a1)][int(a2) - 1]
if (type(pm1) == list):
permission_list.extend(pm1)
else:
permission_list.append(pm1)
if (dict1[a2] != 0):
dict2 = dict1[a2]
for key2 in dict2.keys():
a3 = key2
pm1 = locals()['list_0_{}_{}'.format(a1, a2)][int(a3) - 1]
if (type(pm1) == list):
permission_list.extend(pm1)
else:
permission_list.append(pm1)
if (dict2[a3] != 0):
dict3 = dict2[a3]
for key3 in dict3.keys():
a4 = key3
pm1 = locals()['list_0_{}_{}_{}'.format(a1, a2, a3)][int(a4) - 1]
if (type(pm1) == list):
permission_list.extend(pm1)
else:
permission_list.append(pm1)
if (dict3[a4] != 0):
dict4 = dict3[a4]
for key4 in dict4.keys():
a5 = key4
pm1 = locals()['list_0_{}_{}_{}_{}'.format(a1, a2, a3, a4)][int(a5) - 1]
if (type(pm1) == list):
permission_list.extend(pm1)
else:
permission_list.append(pm1)
if (dict4[a5] != 0):
dict5 = dict4[a5]
for key5 in dict5.keys():
a6 = key5
pm1 = locals()['list_0_{}_{}_{}_{}_{}'.format(a1, a2, a3, a4, a5)][int(a6) - 1]
if (type(pm1) == list):
permission_list.extend(pm1)
else:
permission_list.append(pm1)
permission_list = list(set(permission_list))
permission_list = list(filter(None, permission_list))
true_list = ['true'] * len(permission_list)
dictionary = dict(zip(permission_list, true_list))
代码
import re
import pymysql
'''
num = {
'1': {
'1': {
'1': 0,
'2': {
'1': 0,
'2': 0
}
},
'2':0,
'3':{
'1': 0
}
},
'2': {
'1': {
'1': {
'1': 0,
'2': 0
},
},
'2':{
'1': 0,
'2': 0
},
'3':0
}
}
num = {
'运营': {
'数据库': {
'运营数据库': 0,
'产品数据库': {
'产品查询': 0,
'下单价格': 0
}
},
'数据分析':0,
'订单管理':{
'订单文件': 0
}
},
'人事': {
'数据库': {
'人事数据库': {
'员工信息': 0,
'人事结构': 0
},
},
'数据分析':{
'打卡出勤': 0,
'绩效': 0
},
'订单管理':0
}
}
'''
user = 'user1'
conn = pymysql.Connect(
host='localhost',
port=3306,
user='root',
passwd='123456',
db='test',
charset='utf8'
)
cursor = conn.cursor()
sql = "select user_name,code from user_permission where user_name='{}'"
sql = sql.format(user)
cursor.execute(sql)
number = cursor.fetchall()
code = number[0][1]
if (code == None):
dict0 = {}
else:
dict0 = eval(code)
permission_list = []
list_0 = ['', '']
list_0_1 = ['database', 'analysis', 'order']
list_0_1_1 = ['operational_database', 'product_database']
list_0_1_1_2 = ['search', 'price']
list_0_1_3 = ['订单文件']
list_0_1_3 = ['file']
list_0_2 = ['database', 'analysis', 'order']
list_0_2_1 = ['人事数据库']
list_0_2_1 = ['hr_database']
list_0_2_1_1 = ['staff', 'personnel']
nist_0_2_2 = ['打卡出勤', '绩效']
list_0_2_2 = ['card', 'achievements']
for key0 in dict0.keys():
a1 = key0
pm1 = locals()['list_0'.format(a1)][int(a1) - 1]
permission_list.append(pm1)
if (dict0[a1] != 0):
dict1 = dict0[a1]
for key1 in dict1.keys():
a2 = key1
pm1 = locals()['list_0_{}'.format(a1)][int(a2) - 1]
if (type(pm1) == list):
permission_list.extend(pm1)
else:
permission_list.append(pm1)
if (dict1[a2] != 0):
dict2 = dict1[a2]
for key2 in dict2.keys():
a3 = key2
pm1 = locals()['list_0_{}_{}'.format(a1, a2)][int(a3) - 1]
if (type(pm1) == list):
permission_list.extend(pm1)
else:
permission_list.append(pm1)
if (dict2[a3] != 0):
dict3 = dict2[a3]
for key3 in dict3.keys():
a4 = key3
pm1 = locals()['list_0_{}_{}_{}'.format(a1, a2, a3)][int(a4) - 1]
if (type(pm1) == list):
permission_list.extend(pm1)
else:
permission_list.append(pm1)
if (dict3[a4] != 0):
dict4 = dict3[a4]
for key4 in dict4.keys():
a5 = key4
pm1 = locals()['list_0_{}_{}_{}_{}'.format(a1, a2, a3, a4)][int(a5) - 1]
if (type(pm1) == list):
permission_list.extend(pm1)
else:
permission_list.append(pm1)
if (dict4[a5] != 0):
dict5 = dict4[a5]
for key5 in dict5.keys():
a6 = key5
pm1 = locals()['list_0_{}_{}_{}_{}_{}'.format(a1, a2, a3, a4, a5)][int(a6) - 1]
if (type(pm1) == list):
permission_list.extend(pm1)
else:
permission_list.append(pm1)
permission_list = list(set(permission_list))
permission_list = list(filter(None, permission_list))
true_list = ['true'] * len(permission_list)
dictionary = dict(zip(permission_list, true_list))
conn.commit()
cursor.close()
conn.close()
结果
这里通过数据库user_permissiom存放员工的用户名与权限编码,以用户user1和user2为例,执行脚本,得到以下结果。
|