diff --git a/common/db.py b/common/db.py index b9e0021..33d02a8 100644 --- a/common/db.py +++ b/common/db.py @@ -1,7 +1,8 @@ import pymongo clients = { - "tfse": pymongo.MongoClient('mongodb://{}:{}@{}:{}'.format('root', 'sromitdTW569kC#M', '116.63.130.34', 27018)) + "tfse": pymongo.MongoClient('mongodb://{}:{}@{}:{}'.format('root', 'sromitdTW569kC#M', '116.63.130.34', 27018)), + "tfse_admin": pymongo.MongoClient('mongodb://{}:{}@{}:{}'.format('root', 'RYIHrqml#LSW6#!*', '116.63.130.34', 27020)), } @@ -35,3 +36,23 @@ def delete_data(param1, param2, param3, param4): collection = clients[param1][param2][param3] collection.delete_one(param4) return True + + +def insert_data(param1, param2, param3, param4): + """ + 插入一条数据 + Parameters: + param1: str 服务器 + param2: str 数据库 + param3: str 数据集 + param4: obj 插入数据 + Returns: + True 执行成功 + False 执行失败 + """ + try: + collection = clients[param1][param2][param3] + collection.insert_one(param4) + return True + except Exception: + return False diff --git a/menus/__init__.py b/menus/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/user/User.py b/user/User.py index f02e5c4..fec0793 100644 --- a/user/User.py +++ b/user/User.py @@ -1,9 +1,66 @@ +from user.process import create_user_process class User: + """ + 用户对象 + Parameters: + uid str 用户ID + email str 邮箱 + name str 用户名 + pwd str 密码 + role str 角色 + group str 群组 + """ def __init__(self): self.uid = None + self.email = None self.name = None + self.pwd = None self.role = None - self.menus = None + self.group = None + + +class UserManage(User): + """ + 用户管理 + """ + + # 创建用户 + def create_user(self): + res = create_user_process(self.email, self.name, self.pwd, self.role, self.group) + if res is not False: + pass + + # 禁用用户 + def disable_user(self): + pass + + # 授权用户 + def authorized_user(self): + pass + + # 删除用户 + def delete_user(self): + pass + + +class UserOperation(User): + """ + 用户操作 + """ + + # 登录 + def login(self): + pass + + +if __name__ == '__main__': + um = UserManage() + um.email = "wangsichuan@fecr.com.cn" + um.name = "王思川" + um.pwd = "pVhsypYQ+Lf81gMHKkkU+xrEhB96jNjbH8PZ6smK8NGnWBuJwHEtr5XPZ+A4dPMsYVZldeyjfR7AVCG3deAWT0JR2aAHqG6pD2IMwA0VqMcXBI2c1uesGRoYNW3815CrAqdRwKlZunpqYkxnWnatfU4zuosuv/7TyY+JhOIS6rV50yiE/Nw/k/aXPtX/ShJI/oybmgzMU+GfODy7k3XnTn9I9vLfFYQrg/m8ybZIL7TGtX+HSUJLZ5ttmFq+cnykBVf2iK7Q3lV6f65tmVmIiU+e2xrBc4nMHyYxZksGJNWeVZ2F45QPrif14BML7X9g/QDqze7Jm3ZHg6fs/wV/ISrvw/C1fPFbSCRfjuLcusLY5fcFG3X0r7kST6vIzbr4ZYH3TZZ0p29+dgEEt+fj+d17URrd92xPzuLz2UIRi/pncNSvZb31PDHMY6pEfjigXOx6o4XTtbLqNIRuo8n+LX8XyJvMPc2EUQEMsRKet6KFpVJTnXGhJkI37lHh4Kc4qv0HIdLVjWd05dlo0R2Ggsm1Fb2vGL35l5YumjkFJjQDV5TV0IhzLWW56A56dluHaMDsOQXqFNVCdnpYmzNtm8pEVYfzxnKJwpq5a0xqaLcf7SO/VmLpFKXj+9ZSEEWK5RAzbSVSoQCIWISLYPDqNRnsXFS1CDwe3xv1+86H3nY=" + um.role = "admin" + um.group = ["admin"] + um.create_user() diff --git a/user/process.py b/user/process.py new file mode 100644 index 0000000..1df71eb --- /dev/null +++ b/user/process.py @@ -0,0 +1,35 @@ +import time + +from werkzeug.security import generate_password_hash + +from common.db import insert_data +from user.scripts import check_mail_fmt, check_pwd_fmt, gen_new_uid +from user.security.rsa import decrypt_data + + +def create_user_process(email, name, pwd, role, group): + """ + 创建新用户流程 + Parameters: + - + Returns: + 执行成功 True + 执行失败 False + """ + + if not check_mail_fmt(email): + return False + + if not check_pwd_fmt(pwd): + return False + + user = dict() + user['UID'] = gen_new_uid() + user['email'] = email + user['name'] = name + user['pwd'] = generate_password_hash(decrypt_data(encrypt_msg=pwd)) + user['role'] = role + user['group'] = group + user['create_time'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + + insert_data("tfse_admin", "用户", "用户信息", user) diff --git a/user/scripts.py b/user/scripts.py index e69de29..ab278c0 100644 --- a/user/scripts.py +++ b/user/scripts.py @@ -0,0 +1,63 @@ +import random +import re + +from common.db import find_data +from user.security.rsa import decrypt_data + + +def check_mail_fmt(email): + """ + 邮箱地址格式校验 + Parameters: + email: 邮箱 + Returns: + result: 邮箱校验结果,正确返回True,不正确返回False + """ + regex = "^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$" + case = (len(email) > 7) and (re.match(regex, email) is not None) + result = True if case else False + return result + + +def check_pwd_fmt(pwd): + """ + 密码强度校验 + Parameters: + pwd: 密码(已加密) + Returns: + result: 密码强度校验结果,正确返回True,不正确返回False + """ + password = decrypt_data(encrypt_msg=pwd) + if not password: + return False + + regex = "^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)^.{8,}$" + case = (len(password) >= 8) and (re.match(regex, password) is not None) + result = True if case else False + return result + + +def gen_new_uid(): + """ + 生成新的用户ID,如果该ID存在,则重新生成 + Returns: + new_id: 生成的用户ID + """ + def make_id(num): + """ + 随机生成字符串 + """ + choices = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + salt = '' + for i in range(num): + salt += random.choice(choices) + return salt + + # 生成新ID + new_id = make_id(8) + # 检查新ID是否存在,如果存在则继续生成新ID + case = find_data("tfse_admin", "用户", "用户信息", {"企业ID": new_id}) is [] + while case: + new_id = make_id(8) + # 新ID可使用,返回新ID + return new_id diff --git a/user/security/__init__.py b/user/security/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/user/security/keys/rsa_private_key.pem b/user/security/keys/rsa_private_key.pem new file mode 100644 index 0000000..1f56a29 --- /dev/null +++ b/user/security/keys/rsa_private_key.pem @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIJJQIBAAKCAgEArqR8oMamVxuOLF0z8cGR4u/OXo+j6GM9my9FMHT5bEvYoFCT +mZe9AMLY8qcW25BPX02oxIM9m3VAxhwaI7V/OOm0Be3pXOJlEtIo+XroMfgPq8k6 +cyfqQl3lVdU7Sgs+IktIda3/Tt1ygfCUH0ejitRfP9coF6sG2MbbnTPfWHcAawEF +bYV4kMicRk6bxB8o6OdhkYkkcMZAlmEpKr3W5SCxJAfLYXEh2M6tlKdu4mdppyUM +XrahzgaqbarDHa33Y2me3jDHroSDmU6kdkc8fT/Stk7aaBKH2mOOGKCGUfCgA3oN +l2ODPNPFqwbXgLOOem9hrC0/yXVrELHULGSwem0wPjThhuGqUi2lGzP5QGbG7BRO +JW9OYteCYQwgVPr6RfkuD4TsoCyo1gwZsOnMEyBRl4a0yDt4BjhS6NBdb3/8rZ0V +AExv2ZTCkTQMhrsUV6MyqLn0LSnDfOaNDdQqGPhshi+31tPKkEFIUA/tGzAhs/HQ +zigxf7I0oNSXPWtLU+anG3NDmv14xCz3CUPfAaI0M5ZUDWDzq6C6BVNf3IEGxDrT +DRy3ZSQgjl0hNVAi2s2IB6dnSn9XYENpIfVTwjzH7Kpnr0Ioft+/SvQiRMLG13Gr +Re2dc6uSqaCflKyzQy9c4JCO6ECgEIzBt5jeOKPUZBmfiSH0TzFwmbkGgHkCAwEA +AQKCAgB/AFktZijTEdPbSVAcECNyP+f4dkbBGWJUtxR+v6Ie8i0vsEkWGfW1Vv0D +wSTrOM+vw77mYXZs1eDr8MXFkBhboABti2z4Qh80h6aKfqnapMVorKaX1cAS0UuU +lsNN/k0KDWs9QPJ4PKwn+HcPJD63F+fIekPKqnIJNNvCP1W9dJTWO+Dhm31o9KpI +qqO2BN7wOEuI1Y2tgU64zSFt1q4u5A5N4GkzjF0L2Ij8oKIPfRqlFVkgi3mxZMGN +jO/lZnyQS9/fPuQHcpBs7XbGGNnRT5eBQmir5EXtOBa+rAXiErWasaiungxzMKH/ +1LLlAi6rtNH3rtRDQeNBOcDNI8/9k1e9ZIztrVXV/Ilq2AFcxgCbbJJVHjWljS28 +dAux9ZkXgZSkfMmSZmSmtk1JcSX32lQAq3UVI9TtESS3vE9iLqvJ6WB6xkiuag/y +R9hRZNCVT6GIcil1kQe4B9xxCzasA3G7NmPG0Q0mWSbVgzvBu4rabPFP6Nw7N6oh +sOhEhfx5bfCRXYvRszYnHLA74O2940bksMpyeH3KPdHsKvh9k8J1rtCIZ86T0sSL +1c1Eeqk2t4axCdhwdJaSyStSuA9VTK1pb3y6Pl/E61QBseSBYjRwrO6vKqRUZTgo +hJB7SbvN9rtQgR4gNDfBO/tjUK84ZaEVjualQKqYNrroxDqG/QKCAQEA5Xs8zu/P +k8bb1GxPwieP2MU6bM2FjrSD6blXqOxFz4c02OV7HG3PT6ykPx2Mrnceoq3TJxmX +sYogFWtGlwD27Z59nsCAfDAfKmNB6O5dMahfoCrSJdKWNpDrNu773Mm/XPtBYCvZ +vsXxo26QbMAto2XG9qd7eHTsns2zUdP8smppDkk6fXQ9DFUyKrObZK/1PZAIPzxE +LuWTbETenNJ91FvUVKmBeg+BAO2t6GS5NZ1utZYf27LsvAQ3XyTHYzlFgS7sCf8L +XwnA9+ykONaEPOX4p4KUI+Kua7cfE3ULgW7EVJTSZgZ3SVEbw2ivRrALoZiCqJR2 +iHxBYMWPL2pXxwKCAQEAwtLylQNLs3oRBieoWFHLrGV/1+7hp1u6svXlX3FIlCO9 +eOQQBoIeSyH4wBaFthb6jxkMXBg2mSmZKZfun2cgGPuqcO8kzNdJV3JUDx7SWJQx ++tcFixHsJmWm0zj5TAF6PQdyZH+XD+/Rq8iDZU+BIUIS1GmyHZEY5BfsBG5HYwgJ +JL/WR/MtaQwuXlWU8BREYq6O1Sv/WIu4Func88theiCMh8STiPbM5ggUL94oO8W6 +TGq30e1z77WXIHhZtu9963sPprVpOBz3t+o3Rg/egLkDsfl9QMfa8oQOnzABOeIF +hTvLK6m4qFOCQGdRrzpWINlNTn4idFeOnGygioblvwKCAQB+2rUun5pb0l3K+2TL +qxr1dXFqm+HslRUmqnIuyw18Pv2TuKdpe7pSDNlummMePnMM8pH610bnubcqn/aR +mtLlX+uJSli8Tc2snNnebYXO4Yia/ZDVn6ex2kJsR4eq8Ut7ltj41MS1lK6S7Zeg +xkt0O9rUlpjGabwzvPoXjdvutKwGXayblRn6K05kFI0eB7bFpU0px6LZWcc43olA +n4s3TNv/QQR1+QQTA1BTWvqXDMQaVTafODVtaddCHQ6rZwlo9As/K2GZ08Z8RrAx +S0QmdeoSjzhc7f4FRWFEXDtT/WtCZlI4W/Ks8M0sJD5gEQkc9zWjAw7TO/zYBd21 +FFAZAoH/Ly7nkS87Jjxp4xO3sawdp6LtU16HSADvNmhXJMZKzZXaTWzudKUOsSOJ +GvxZZcAq7n0igStcDbwFXA1vvSs8mtBYdwFz6Cg7mvIVaZQNXWaGtDlfHk844hO8 +U2t49O9mq2EiUzSTYUizfucQ63hVzbgy1z7B5Gc/n/4rKueKYnGPxVawjrxWQxqw +ICiZ6Yr/BOdBsF73eHpeGy6IVILtGKbJYhg5ovIirZNHUFB9bfx1Igy2eCEJ8wQH +ldWP5L4bwOwM3lMRKIXbeK9As7ckLAii3HeP3iCI5jMVV3hI07vpmlrg2bJBBoMz +CGX9YnK+aTY3gssJjSOnZjropqQFAoIBAHUJKTJuSaDDva6VvuM2E3PYwadI7a1z +9myXh+Q1DaT7bD6c56ya43W0iJrjfY6Bfzo3ZiwD2CmV447+0USRueWnPOdFD8ni +N5fe6a8HUAPXy2XU3NWbGukZmXQ1YBJoFphXXODFoq3/NGeX/pFUSfkXc73OY5s+ +96aVpj3jBjp47X2yHzI+0wGokwSH0FKWBTuin+mR81uP1ifNdzCVwOBUF+g12FV9 +Lk+zLlOWNIFun2v/pNlwqaLIxKHLfNYbOK2S9SKehFCQbw6kYgdn8gXVsPMQfQuB +TcSugqFtSGmTnnUpt3vq8AB2RAxDXcXztNw3NEl8wmJzqFjuAd0tJf0= +-----END RSA PRIVATE KEY----- diff --git a/user/security/keys/rsa_public_key.pem b/user/security/keys/rsa_public_key.pem new file mode 100644 index 0000000..9fab22b --- /dev/null +++ b/user/security/keys/rsa_public_key.pem @@ -0,0 +1,13 @@ +-----BEGIN RSA PUBLIC KEY----- +MIICCgKCAgEArqR8oMamVxuOLF0z8cGR4u/OXo+j6GM9my9FMHT5bEvYoFCTmZe9 +AMLY8qcW25BPX02oxIM9m3VAxhwaI7V/OOm0Be3pXOJlEtIo+XroMfgPq8k6cyfq +Ql3lVdU7Sgs+IktIda3/Tt1ygfCUH0ejitRfP9coF6sG2MbbnTPfWHcAawEFbYV4 +kMicRk6bxB8o6OdhkYkkcMZAlmEpKr3W5SCxJAfLYXEh2M6tlKdu4mdppyUMXrah +zgaqbarDHa33Y2me3jDHroSDmU6kdkc8fT/Stk7aaBKH2mOOGKCGUfCgA3oNl2OD +PNPFqwbXgLOOem9hrC0/yXVrELHULGSwem0wPjThhuGqUi2lGzP5QGbG7BROJW9O +YteCYQwgVPr6RfkuD4TsoCyo1gwZsOnMEyBRl4a0yDt4BjhS6NBdb3/8rZ0VAExv +2ZTCkTQMhrsUV6MyqLn0LSnDfOaNDdQqGPhshi+31tPKkEFIUA/tGzAhs/HQzigx +f7I0oNSXPWtLU+anG3NDmv14xCz3CUPfAaI0M5ZUDWDzq6C6BVNf3IEGxDrTDRy3 +ZSQgjl0hNVAi2s2IB6dnSn9XYENpIfVTwjzH7Kpnr0Ioft+/SvQiRMLG13GrRe2d +c6uSqaCflKyzQy9c4JCO6ECgEIzBt5jeOKPUZBmfiSH0TzFwmbkGgHkCAwEAAQ== +-----END RSA PUBLIC KEY----- diff --git a/user/security/rsa.py b/user/security/rsa.py new file mode 100644 index 0000000..77d9ab4 --- /dev/null +++ b/user/security/rsa.py @@ -0,0 +1,75 @@ +import os +import base64 + +from Crypto.PublicKey import RSA +from Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipher + + +def get_key(**kwargs): + """ + 获取密钥 + Parameters: + key_file str 密钥文件名称 + Returns: + key 密钥 + """ + key_file = kwargs['key_file'] # 密钥文件 + key_path = os.path.abspath(os.path.abspath(os.path.dirname(__file__)) + '/keys/' + key_file) # 密钥文件绝对路径 + with open(key_path) as f: + data = f.read() + key = RSA.importKey(data) + return key + + +def encrypt_data(**kwargs): + """ + 用公钥加密 + Parameters: + msg str 待加密信息 + Returns: + 加密后结果 + """ + msg = kwargs['msg'] # 待加密信息 + public_key = get_key(key_file='rsa_public_key.pem') # 获取密钥 + cipher = PKCS1_cipher.new(public_key) + encrypt_text = base64.b64encode(cipher.encrypt(bytes(msg.encode("utf8")))) + return encrypt_text.decode('utf-8') + + +def decrypt_data(**kwargs): + """ + 用私钥解密 + Parameters: + encrypt_msg str 加密信息 + Returns: + 执行正确 解密后结果 + 执行错误 False + """ + try: + encrypt_msg = kwargs['encrypt_msg'] # 加密信息 + private_key = get_key(key_file='rsa_private_key.pem') # 获取密钥 + cipher = PKCS1_cipher.new(private_key) + back_text = cipher.decrypt(base64.b64decode(encrypt_msg), 0) + return back_text.decode('utf-8') + except Exception: + return False + + +def check_data(**kwargs): + """ + 对比数据和加密数据 + Parameters: + msg str 数据 + encrypt_msg str 加密数据 + Returns: + True 对比正确 + False 对比错误 + """ + msg = kwargs['msg'] + decrypt_msg = decrypt_data(encrypt_msg=kwargs['encrypt_msg']) + if decrypt_msg is False: + return False + elif msg == decrypt_msg: + return True + else: + return False diff --git a/user/static/db_design/user.json b/user/static/db_design/user.json index 5760061..c1f1a69 100644 --- a/user/static/db_design/user.json +++ b/user/static/db_design/user.json @@ -1,6 +1,10 @@ { "UID": null, + "email": null, + "pwd": null, "name": null, + "status": null, "role": null, - "menus": null + "group": null, + "create_time": null } \ No newline at end of file