diff --git a/install/yearning-docker-compose/init-sql/install.sql b/install/yearning-docker-compose/init-sql/install.sql index 60a0a990..b2decde8 100644 --- a/install/yearning-docker-compose/init-sql/install.sql +++ b/install/yearning-docker-compose/init-sql/install.sql @@ -310,7 +310,7 @@ CREATE TABLE `django_migrations` ( BEGIN; -INSERT INTO `core_grained` VALUES (29, 'admin', '{\'ddl\': \'0\', \'ddlcon\': [], \'dml\': \'0\', \'dmlcon\': [], \'dic\': \'0\', \'diccon\': [], \'dicedit\': \'0\', \'user\': \'1\', \'base\': \'1\', \'dicexport\': \'0\', \'person\': [], \'query\': \'0\', \'querycon\': []}'); +INSERT INTO `core_grained` VALUES (1, 'admin', '{\'ddl\': \'0\', \'ddlcon\': [], \'dml\': \'0\', \'dmlcon\': [], \'dic\': \'0\', \'diccon\': [], \'dicedit\': \'0\', \'user\': \'1\', \'base\': \'1\', \'dicexport\': \'0\', \'person\': [], \'query\': \'0\', \'querycon\': []}'); INSERT INTO `core_globalpermissions` VALUES (1, 'global', '{\'host\': \'\', \'port\': \'\', \'user\': \'\', \'password\': \'\', \'back_host\': \'\', \'back_port\': \'\', \'back_user\': \'\', \'back_password\': \'\'}', '{\'type\': \'\', \'host\': \'\', \'sc\': \'\', \'domain\': \'\', \'user\': \'\', \'password\': \'\'}', '{\'webhook\': \'\', \'smtp_host\': \'\', \'smtp_port\': \'\', \'user\': \'\', \'password\': \'\', \'to_user\': \'\', \'mail\': False, \'ding\': False}', '{\'limit\': \'\', \'con_room\': [\'AWS\', \'Aliyun\', \'Own\', \'Other\'], \'foce\': \'\', \'multi\': False, \'query\': False, \'sensitive_list\': [], \'sensitive\': \'\'}'); INSERT INTO `core_account` VALUES (1, 'pbkdf2_sha256$100000$Dy6mFniGxTZa$YBQ9cX0iPQvTYp06C5ZiVgXICTHNTiwWhWYnRmcqjHY=', NULL, 0, 'admin', '', '', '', 1, 1, '2018-07-26 07:15:33.931971', 'admin', '', 'admin'); COMMIT; diff --git a/src/core/api/serachsql.py b/src/core/api/serachsql.py index 589404f4..32a23dea 100644 --- a/src/core/api/serachsql.py +++ b/src/core/api/serachsql.py @@ -13,6 +13,15 @@ from libs import con_database from core.models import DatabaseList, Account, querypermissions, query_order, globalpermissions +try: + from core.models import globalpermissions + + setting = globalpermissions.objects.filter(authorization='global').first() + exclued_database_name = setting.other.get('exclued_db_list', []) +except Exception: + logging.error("exclued_database_name配置错误.") + exclued_database_name = [] + CUSTOM_ERROR = logging.getLogger('Yearning.core.views') @@ -56,7 +65,7 @@ def post(self, request, args=None): db=address['basename'] ) as f: try: - query_sql = replace_limit(check[-1].strip(), limit['limit']) + query_sql = replace_limit(check[-1].strip(), limit.get('limit', '1024')) data_set = f.search(sql=query_sql) except Exception as e: CUSTOM_ERROR.error(f'{e.__class__.__name__}: {e}') @@ -167,7 +176,7 @@ def put(self, request, args: str = None): query_per = 2 work_id = util.workId() if not query_switch['query']: - query_per = 1 + query_per = 2 else: userinfo = Account.objects.filter(username=audit, group='admin').first() try: @@ -252,12 +261,11 @@ def put(self, request, args: str = None): port=_connection.port) as f: dataname = f.query_info(sql='show databases') children = [] - ignore = ['information_schema', 'sys', 'performance_schema', 'mysql'] - for index, uc in enumerate(dataname): + ignore = exclued_database_name + for index, uc in sorted(enumerate(dataname), reverse=True): for cc in ignore: if uc['Database'] == cc: del dataname[index] - index = index - 1 for i in dataname: with con_database.SQLgo(ip=_connection.ip, user=_connection.username, diff --git a/src/core/api/user.py b/src/core/api/user.py index 8ecab2bd..2215f2ef 100644 --- a/src/core/api/user.py +++ b/src/core/api/user.py @@ -3,6 +3,7 @@ from libs import baseview, util from core.task import grained_permissions,set_auth_group from libs.serializers import UserINFO +from libs.send_email import send_email from rest_framework.response import Response from django.http import HttpResponse from django.contrib.auth import authenticate @@ -20,6 +21,52 @@ jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER +def __adduser__(request, args=None): + try: + username = request.data['username'] + password = request.data['password'] + group = request.data.get('group', 'guest') + email = request.data['email'] + realname = request.data.get('realname', '') + department = request.data.get('department', 'Unkonw') + auth_group = ','.join(json.loads(request.data.get('auth_group','[]'))) + _send_mail = send_email(to_addr=email) + _status, _message = _send_mail.email_check() + if _status != 200: + return Response(data=_message) + except KeyError as e: + CUSTOM_ERROR.error(f'{e.__class__.__name__}: {e}') + return HttpResponse(status=500) + else: + try: + if group == 'admin' or group == 'perform': + user = Account.objects.create_user( + username=username, + password=password, + department=department, + group=group, + is_staff=1, + email=email, + realname=realname, + auth_group=auth_group) + user.save() + return Response('%s 用户注册成功!' % username) + elif group == 'guest': + user = Account.objects.create_user( + username=username, + password=password, + department=department, + group=group, + email=email, + realname=realname, + auth_group=auth_group + ) + user.save() + return Response('%s 用户注册成功!' % username) + except Exception as e: + CUSTOM_ERROR.error(f'{e.__class__.__name__}: {e}') + return HttpResponse(e) + class userinfo(baseview.BaseView): ''' @@ -92,13 +139,14 @@ def put(self, request, args=None): try: username = request.data['username'] mail = request.data['mail'] + realname = request.data['realname'] except KeyError as e: CUSTOM_ERROR.error(f'{e.__class__.__name__}: {e}') return HttpResponse(status=500) else: try: - Account.objects.filter(username=username).update(email=mail) - return Response('%s--E-mail修改成功!' % username) + Account.objects.filter(username=username).update(email=mail, realname=realname) + return Response('%s--实名 & E-mail修改成功!' % username) except Exception as e: CUSTOM_ERROR.error(f'{e.__class__.__name__}: {e}') return HttpResponse(status=500) @@ -107,10 +155,15 @@ def post(self, request, args=None): try: username = request.data['username'] password = request.data['password'] - group = request.data['group'] - department = request.data['department'] + group = request.data.get('group', 'guest') email = request.data['email'] + realname = request.data.get('realname', '') + department = request.data.get('department', 'Unkonw') auth_group = ','.join(json.loads(request.data['auth_group'])) + _send_mail = send_email(to_addr=email) + _status, _message = _send_mail.email_check() + if _status != 200: + return Response(data=_message) except KeyError as e: CUSTOM_ERROR.error(f'{e.__class__.__name__}: {e}') return HttpResponse(status=500) @@ -124,6 +177,7 @@ def post(self, request, args=None): group=group, is_staff=1, email=email, + realname=realname, auth_group=auth_group) user.save() return Response('%s 用户注册成功!' % username) @@ -134,6 +188,7 @@ def post(self, request, args=None): department=department, group=group, email=email, + realname=realname, auth_group=auth_group ) user.save() @@ -261,6 +316,12 @@ def post(self, request, args: str = None): return Response({'token': 'null', 'res': 'ldap账号认证失败,请检查ldap账号或ldap配置!'}) +class login_register(baseview.AnyLogin): + + def post(self, request, args=None): + return __adduser__(request, args) + + class login_auth(baseview.AnyLogin): def post(self, request, args: str = None): diff --git a/src/core/models.py b/src/core/models.py index fe89f6d7..4532abc8 100644 --- a/src/core/models.py +++ b/src/core/models.py @@ -32,6 +32,7 @@ class Account(AbstractUser): ''' User table ''' + realname= models.CharField(max_length=64,default="") # 实名 group = models.CharField(max_length=40) # 权限组 guest/admin department = models.CharField(max_length=40) # 部门 auth_group = models.CharField(max_length=100, null=True) #细粒化权限组 diff --git a/src/libs/send_email.py b/src/libs/send_email.py index 104519af..2f75d026 100644 --- a/src/libs/send_email.py +++ b/src/libs/send_email.py @@ -4,6 +4,9 @@ from email.utils import parseaddr, formataddr import smtplib import ast +import logging + +CUSTOM_ERROR = logging.getLogger('Yearning.core.views') class send_email(object): @@ -12,6 +15,7 @@ def __init__(self, to_addr=None): self.to_addr = to_addr un_init = util.init_conf() self.email = ast.literal_eval(un_init['message']) + self.email_suffix_list = ast.literal_eval(util.init_conf().get('other', '')).get('email_suffix_list',[]) # 获取可以注册邮箱后缀 def _format_addr(self, s): name, addr = parseaddr(s) @@ -128,3 +132,23 @@ def send_mail(self, mail_data=None, type=None): server.login(self.email['user'], self.email['password']) server.sendmail(self.email['user'], [self.to_addr], msg.as_string()) server.quit() + + def email_check(self): + try: + if self.to_addr.split('@')[1] not in self.email_suffix_list: + CUSTOM_ERROR.warning("邮箱地址[%s]不在允许注册邮箱范围内%s,请更换邮箱地址进行注册" % (self.to_addr, self.email_suffix_list)) + return 300, "邮箱地址[%s]不在允许注册邮箱范围内%s,请更换邮箱地址进行注册" % (self.to_addr, self.email_suffix_list) + server = smtplib.SMTP(self.email['smtp_host'], int(self.email['smtp_port'])) + server.login(self.email['user'], self.email['password']) + server.mail(sender=self.email['user']) + _code, _msg = server.rcpt(self.to_addr) + if _code in (250, 251, 452): + CUSTOM_ERROR.info("SMTP检查邮箱地址[%s]存在,检查通过" % (self.to_addr)) + return 200, "SMTP检查邮箱地址[%s]存在,检查通过" % (self.to_addr) + else: + CUSTOM_ERROR.warning( + "SMTP检查邮箱地址[%s]异常,请更换邮箱地址进行注册.SMTP RCPT CODE:%s MSG:%s" % (self.to_addr, _code, _msg)) + return 300, "SMTP检查邮箱地址[%s]异常,请更换邮箱地址进行注册" % (self.to_addr) + except Exception as e: + CUSTOM_ERROR.error(f'{e.__class__.__name__}: {e}') + return 500, "邮箱检查失败" diff --git a/src/libs/serializers.py b/src/libs/serializers.py index fa51a7a5..bb471648 100644 --- a/src/libs/serializers.py +++ b/src/libs/serializers.py @@ -37,7 +37,7 @@ class UserINFO(serializers.HyperlinkedModelSerializer): class Meta: model = Account - fields = ('id', 'username', 'group', 'department', 'email', 'auth_group') + fields = ('id', 'username', 'group', 'department', 'email', 'realname', 'auth_group') class SQLGeneratDic(serializers.HyperlinkedModelSerializer): diff --git a/src/settingConf/urls.py b/src/settingConf/urls.py index 20275852..134e9ee6 100644 --- a/src/settingConf/urls.py +++ b/src/settingConf/urls.py @@ -14,7 +14,8 @@ generaluser, authgroup, ldapauth, - login_auth + login_auth, + login_register ) from core.api.dashboard import ( dashboard, @@ -51,6 +52,7 @@ url(r'^api/v1/query_order', Query_order.as_view()), url(r'^api/v1/query_worklf', query_worklf.as_view()), url(r'^api/v1/userinfo/(.*)', userinfo.as_view()), + url(r'^api/v1/loginregister/(.*)', login_register.as_view()), url(r'^api/v1/audit_grained/(.*)', audit_grained.as_view()), url(r'^api/v1/apply_grained', apply_grained.as_view()), url(r'^api/v1/workorder/(.*)', addressing.as_view()), diff --git a/webpage/src/Login.vue b/webpage/src/Login.vue index 2b7e853a..ae3325b5 100644 --- a/webpage/src/Login.vue +++ b/webpage/src/Login.vue @@ -26,12 +26,10 @@
- - + - - + @@ -40,16 +38,46 @@
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +

如需注册账号请联系平台管理员

+

2018 © Power By Cookie.Ye 使用chrome获得最佳体验

+
+
+
+
- - + - + @on-keyup.enter="authdata()"> @@ -74,7 +102,65 @@ }, name: 'Login', data () { + const valideuserinfoPassword = (rule, value, callback) => { + if (value !== this.userinfo.password) { + callback(new Error('两次输入密码不一致')) + } else { + callback() + } + } return { + userinfo: { + username: '', + password: '', + confirmpassword: '', + realname: '', + email: '', + authgroup: [] + }, + userinfoValidate: { + username: [{ + required: true, + message: '请输入用户名', + trigger: 'blur' + }], + password: [{ + required: true, + message: '请输入密码', + trigger: 'blur' + }, + { + min: 6, + message: '请至少输入6个字符', + trigger: 'blur' + }, + { + max: 32, + message: '最多输入32个字符', + trigger: 'blur' + } + ], + confirmpassword: [{ + required: true, + message: '请再次输入新密码', + trigger: 'blur' + }, + { + validator: valideuserinfoPassword, + trigger: 'blur' + } + ], + realname: [{ + required: true, + message: '请输入真实姓名', + trigger: 'blur' + }], + email: [{ + required: true, + message: '请输入邮箱名称', + trigger: 'blur' + }] + }, formInline: { user: '', password: '' @@ -101,6 +187,33 @@ } }, methods: { + LoginRegister () { + this.$refs['userinfova'].validate((valid) => { + if (valid) { + axios.post(util.url + '/loginregister/', { + 'username': this.userinfo.username, + 'password': this.userinfo.password, + 'confirmpassword': this.userinfo.confirmpassword, + 'realname': this.userinfo.realname, + 'email': this.userinfo.email, + 'auth_group': JSON.stringify(this.userinfo.authgroup) + }) + .then(res => { + util.notice(res.data) + this.userinfo = { + username: '', + password: '', + confirmpassword: '', + realname: '', + email: '' + } + }) + .catch(error => { + util.err_notice(error) + }) + } + }) + }, authdata () { axios.post(util.auth, { 'username': this.formInline.user, diff --git a/webpage/src/components/Management/Setting.vue b/webpage/src/components/Management/Setting.vue index 25f23f8b..73ab90e7 100644 --- a/webpage/src/components/Management/Setting.vue +++ b/webpage/src/components/Management/Setting.vue @@ -153,6 +153,22 @@ + + {{ v }} + +
+ + +
+ + {{ v }} + +
+ + +
{{ v }} @@ -259,6 +275,14 @@ this.other.sensitive_list.push(this.other.sensitive) this.other.sensitive = '' }, + handleAdd_exclued_db () { + this.other.exclued_db_list.push(this.other.exclued_db) + this.other.exclued_db = '' + }, + handleAddemail () { + this.other.email_suffix_list.push(this.other.email_suffix) + this.other.email_suffix = '' + }, handleClose2 (event, name) { const index = this.other.con_room.indexOf(name) this.other.con_room.splice(index, 1) @@ -267,6 +291,16 @@ const index = this.other.sensitive_list.indexOf(name) this.other.sensitive_list.splice(index, 1) }, + handleClose_exclued_db (event, name) { + const index = this.other.exclued_db_list.indexOf(name) + this.other.exclued_db_list.splice(index, 1) + }, + handleCloseemail (event, name) { + const index = this.other.email_suffix_list.indexOf(name) + this.other.email_suffix_list.splice(index, 1) + console.log(this.other.email_suffix) + console.log(this.other.email_suffix_list) + }, multi_switching (status) { this.other.multi = status }, @@ -342,6 +376,10 @@ this.other = res.data.other this.other.multi ? this.other.multi = true : this.other.multi = false this.other.query ? this.other.query = true : this.other.query = false + this.other.exclued_db_list ? this.other.exclued_db_list = this.other.exclued_db_list : this.other.exclued_db_list = [] + this.other.exclued_db ? this.other.exclued_db = this.other.exclued_db : this.other.exclued_db = '' + this.other.email_suffix_list ? this.other.email_suffix_list = this.other.email_suffix_list : this.other.email_suffix_list = [] + this.other.email_suffix ? this.other.email_suffix = this.other.email_suffix : this.other.email_suffix = '' this.ldap = res.data.ldap } }) diff --git a/webpage/src/components/Management/UserInfo.vue b/webpage/src/components/Management/UserInfo.vue index 518f73d1..96252f8c 100644 --- a/webpage/src/components/Management/UserInfo.vue +++ b/webpage/src/components/Management/UserInfo.vue @@ -4,7 +4,7 @@