def test(self): result = encrypt_helper.md5(1) print(result) self.assertEqual(result, 'c4ca4238a0b923820dcc509a6f75849b') result = encrypt_helper.md5('1') print(result) self.assertEqual(result, 'c4ca4238a0b923820dcc509a6f75849b') result = encrypt_helper.md5(b'1') print(result) self.assertEqual(result, 'c4ca4238a0b923820dcc509a6f75849b')
def test(self): dict = { 'a': 1, 'b': "2" } result = encrypt_helper.md5(dict) print(result) result = encrypt_helper.md5('1') print(result) result = encrypt_helper.md5(b'1') print(result)
def get_model_for_url(self, key): """通过当前页面路由url,获取菜单对应的记录""" # 使用md5生成对应的缓存key值 key_md5 = encrypt_helper.md5(key) # 从缓存中提取菜单记录 model = cache_helper.get(key_md5) # 记录不存在时,运行记录载入缓存程序 if not model: self._load_cache() model = cache_helper.get(key_md5) return model
def check_login_power(id, k, t, sessionid): """ 检查拨号小信接口,验证用户是否有权限访问 :param id: 用户id :param k: 32位长度的密钥串 :param t: 时间戳 :param sessionid: 当前用户的密钥 :return: False=验证失败,True=验证成功 """ if not sessionid: return False return encrypt_helper.md5( str(id) + sessionid + str(t) + sessionid + str(id)) == k
def get_model_for_cache_of_where(self, where): """ 通过条件获取记录实体——条件必须是额外的主键,也就是说记录是唯一的(我们经常需要使用key、编码或指定条件来获取记录,这时可以通过当前方法来获取) :param where: 查询条件 :return: 记录实体 """ # 生成实体缓存key model_cache_key = self.__table_name + encrypt_helper.md5(where) # 通过条件从缓存中获取记录id pk = cache_helper.get(model_cache_key) # 如果主键id存在,则直接从缓存中读取记录 if pk: return self.get_model_for_cache(pk) # 否则从数据库中获取 result = self.get_model(where) if result: # 存储条件对应的主键id值到缓存中 cache_helper.set(model_cache_key, result.get(self.__pk_name)) # 存储记录实体到缓存中 self.set_model_for_cache(result.get(self.__pk_name), result) return result
def check_operation_times(operation_name, limiting_frequency, ip, is_add=True): """ 检查操作次数 参数: operation_name 操作名称 limiting_frequency 限制次数 is_add 是否累加 返回参数: True 不限制 False 限制操作 """ if not operation_name or limiting_frequency is None: return False, '参数错误,错误码:-400-001,请与管理员联系', '', 0 # 如果限制次数为0时,默认不限制操作 if limiting_frequency <= 0: return True, '', '', 0 ############################################################## ### 判断用户操作次数,超出次数限制执行 ### # 获取当前用户已记录操作次数 operation_times_key = operation_name + '_' + encrypt_helper.md5( operation_name + ip) operation_times = convert_helper.to_int0( cache_helper.get(operation_times_key)) # 如果系统限制了出错次数,且当前用户已超出限制,则返回错误 if limiting_frequency and operation_times >= limiting_frequency: return False, '您在10分钟内连续操作次数达到' + str( limiting_frequency ) + '次,已超出限制,请稍候再试', operation_times_key, operation_times if is_add: # 记录操作次数,默认在缓存中存储10分钟 cache_helper.set(operation_times_key, operation_times + 1, 600) return True, '', operation_times_key, operation_times
def _load_cache(self): """全表记录载入缓存""" # 生成缓存载入状态key,主要用于检查是否已执行了菜单表载入缓存判断 cache_key = self.__table_name + '_is_load' # 将自定义的key存储到全局缓存队列中(关于全局缓存队列请查看前面ORM对应章节说明) self.add_relevance_cache_in_list(cache_key) # 获取缓存载入状态,检查记录是否已载入缓存,是的话则不再执行 if cache_helper.get(cache_key): return # 从数据库中读取全部记录 result = self.get_list() # 标记记录已载入缓存 cache_helper.set(cache_key, True) # 如果菜单表没有记录,则直接退出 if not result: return # 循环遍历所有记录,组合处理后,存储到nosql缓存中 for model in result.get('rows', {}): # 提取菜单页面对应的接口(后台菜单管理中的接口值,同一个菜单操作时,经常需要访问多个接口,所以这个值有中存储多们接口值) interface_url = model.get('interface_url', '') if not interface_url: continue # 获取前端html页面地址 page_url = model.get('page_url', '') # 同一页面接口可能有多个,所以需要进行分割 interface_url_arr = interface_url.replace('\n', '').replace( ' ', '').split(',') # 逐个接口处理 for interface in interface_url_arr: # html+接口组合生成key url_md5 = encrypt_helper.md5(page_url + interface) # 存储到全局缓存队列中,方便菜单记录更改时,自动清除这些自定义缓存 self.add_relevance_cache_in_list(url_md5) # 存储到nosql缓存 cache_helper.set(url_md5, model)
def post_login(): """用户登陆验证""" ############################################################## # 获取并验证客户端提交的参数 ############################################################## username = web_helper.get_form('username', '帐号') password = web_helper.get_form('password', '密码') verify = web_helper.get_form('verify', '验证码') ip = web_helper.get_ip() ############################################################## # 从session中读取验证码信息 ############################################################## s = web_helper.get_session() verify_code = s.get('verify_code') print(verify, s) # 删除session中的验证码(验证码每提交一次就失效) if 'verify_code' in s: del s['verify_code'] s.save() # 判断用户提交的验证码和存储在session中的验证码是否相同 if verify.upper() != verify_code: return web_helper.return_msg(-1, '验证码错误') ############################################################## ### 获取登录用户记录,并进行登录验证 ### ############################################################## sql = """select * from manager where login_name='%s'""" % (username, ) # 从数据库中读取用户信息 manager_result = db_helper.read(sql) # 判断用户记录是否存在 if not manager_result: return web_helper.return_msg(-1, '账户不存在') ############################################################## ### 验证用户登录密码与状态 ### ############################################################## # 对客户端提交上来的验证进行md5加密将转为大写(为了密码的保密性,这里进行双重md5加密,加密时从第一次加密后的密串中提取一段字符串出来进行再次加密,提取的串大家可以自由设定) # pwd = encrypt_helper.md5(encrypt_helper.md5(password)[1:30]).upper() # 对客户端提交上来的验证进行md5加密将转为大写(只加密一次) pwd = encrypt_helper.md5(password).upper() # 检查登录密码输入是否正确 if pwd != manager_result[0].get('login_password', ''): return web_helper.return_msg(-1, '密码错误') # 检查该账号虽否禁用了 if manager_result[0].get('is_enable', 0) == 0: return web_helper.return_msg(-1, '账号已被禁用') ############################################################## ### 把用户信息保存到session中 ### ############################################################## manager_id = manager_result[0].get('id', 0) s['id'] = manager_id s['login_name'] = username s.save() ############################################################## ### 更新用户信息到数据库 ### ############################################################## # 更新当前管理员最后登录时间、Ip与登录次数(字段说明,请看数据字典) sql = """update manager set last_login_time=%s, last_login_ip=%s, login_count=login_count+1 where id=%s""" # 组合更新值 vars = ( 'now()', ip, manager_id, ) # 写入数据库 db_helper.write(sql, vars) data = [{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}] return web_helper.return_msg(0, '登录成功', data)
def callback(): """ 新增记录 """ # 检查用户权限 _common_logic.check_user_power() name = web_helper.get_form('name', '管理员名称') sex = web_helper.get_form('sex', '性别', is_check_null=False) if sex != '男': sex = '女' mobile = web_helper.get_form('mobile', '手机号码', is_check_null=False) if mobile and not string_helper.is_mobile(mobile): return web_helper.return_msg(-1, '手机号码格式不正确') birthday = web_helper.get_form('birthday', '出生日期', is_check_null=False) if birthday: birthday = convert_helper.to_date(birthday) email = web_helper.get_form('email', 'email', is_check_null=False) if email and not string_helper.is_email(email): return web_helper.return_msg(-1, 'Email格式不正确') remark = web_helper.get_form('remark', '备注', is_check_null=False) department_id = convert_helper.to_int0( web_helper.get_form('department_id', '所属部门')) positions_id = convert_helper.to_int0( web_helper.get_form('positions_id', '所属职位')) is_work = convert_helper.to_int0(web_helper.get_form('is_work', '工作状态')) is_enabled = web_helper.get_form('is_enabled', '是否启用', is_check_null=False) login_name = web_helper.get_form('login_name', '登录账号') login_password = web_helper.get_form('login_password1', '登录密码', is_check_special_char=False) if len(login_password) < 6: return web_helper.return_msg(-1, '登录密码长度必须大于等于6位') login_password = encrypt_helper.md5( encrypt_helper.md5(login_password)[2:24]) # 判断提交的部门id是否正确 _department_logic = department_logic.DepartmentLogic() department_result = _department_logic.get_model_for_cache(department_id) if not department_result: return web_helper.return_msg(-1, '所属部门不存在') # 判断提交的职位id是否正确 _positions_logic = positions_logic.PositionsLogic() positions_result = _positions_logic.get_model_for_cache(positions_id) if not positions_result or positions_result.get( 'department_id') != department_id: return web_helper.return_msg(-1, '所属职位不存在') _manager_logic = manager_logic.ManagerLogic() # 组合更新字段 fields = { 'name': string(name), 'sex': string(sex), 'mobile': string(mobile), 'email': string(email), 'remark': string(remark), 'department_id': department_id, 'department_code': string(department_result.get('code', '')), 'department_name': string(department_result.get('name', '')), 'positions_id': positions_id, 'positions_name': string(positions_result.get('name', '')), 'is_work': is_work, 'is_enabled': is_enabled, 'login_name': string(login_name), 'login_password': string(login_password), } if birthday: fields['birthday'] = string(str(birthday)) # 添加记录 result = _manager_logic.add_model(fields) if result: return web_helper.return_msg(0, '成功') else: return web_helper.return_msg(-1, "提交失败")
def post_login(): """用户登陆验证""" ############################################################## # 获取并验证客户端提交的参数 ############################################################## username = web_helper.get_form('username', '帐号') password = web_helper.get_form('password', '密码') verify = web_helper.get_form('verify', '验证码') ip = web_helper.get_ip() ############################################################## # 从session中读取验证码信息 ############################################################## s = web_helper.get_session() verify_code = s.get('verify_code') # 删除session中的验证码(验证码每提交一次就失效) if 'verify_code' in s: del s['verify_code'] s.save() # 判断用户提交的验证码和存储在session中的验证码是否相同 if verify.upper() != verify_code: return web_helper.return_msg(-1, '验证码错误') ############################################################## ### 判断用户登录失败次数,超出次做登录限制 ### # 获取管理员登录密码错误限制次数,0=无限制,x次/小时 limit_login_count = 10 # 获取操作出错限制值 is_ok, msg, operation_times_key, error_count = security_helper.check_operation_times('login_error_count', limit_login_count, web_helper.get_ip(), False) # 判断操作的出错次数是否已超出了限制 if not is_ok: return web_helper.return_msg(-1, msg) ############################################################## ### 获取登录用户记录,并进行登录验证 ### ############################################################## # 初始化操作日志记录类 _manager_operation_log_logic = manager_operation_log_logic.ManagerOperationLogLogic() # 初始化管理员逻辑类 _manager_logic = manager_logic.ManagerLogic() # 从数据库中读取用户信息 manager_result = _manager_logic.get_model_for_cache_of_where('login_name=' + string(username)) # 判断用户记录是否存在 if not manager_result: return web_helper.return_msg(-1, '账户不存在') # 获取管理员id manager_id = manager_result.get('id', 0) # 获取管理员姓名 manager_name = manager_result.get('name', '') ############################################################## ### 验证用户登录密码与状态 ### ############################################################## # 对客户端提交上来的验证进行md5加密将转为大写(为了密码的保密性,这里进行双重md5加密,加密时从第一次加密后的密串中提取一段字符串出来进行再次加密,提取的串大家可以自由设定) # pwd = encrypt_helper.md5(encrypt_helper.md5(password)[1:30]).upper() # 对客户端提交上来的验证进行md5加密将转为大写(只加密一次) pwd = encrypt_helper.md5(password).upper() # 检查登录密码输入是否正确 if pwd != manager_result.get('login_password').upper(): # 记录出错次数 security_helper.add_operation_times(operation_times_key) # 记录日志 _manager_operation_log_logic.add_operation_log(manager_id, manager_name, ip, '【' + manager_name + '】输入的登录密码错误') return web_helper.return_msg(-1, '密码错误') # 检查该账号虽否禁用了 if not manager_result.get('is_enabled'): # 记录出错次数 security_helper.add_operation_times(operation_times_key) # 记录日志 _manager_operation_log_logic.add_operation_log(manager_id, manager_name, ip, '【' + manager_name + '】账号已被禁用,不能登录系统') return web_helper.return_msg(-1, '账号已被禁用') # 登录成功,清除登录错误记录 security_helper.del_operation_times(operation_times_key) ############################################################## ### 把用户信息保存到session中 ### ############################################################## manager_id = manager_result.get('id') s['id'] = manager_id s['login_name'] = username s['name'] = manager_result.get('name') s['positions_id'] = manager_result.get('positions_id') s.save() ############################################################## ### 更新用户信息到数据库 ### ############################################################## # 更新当前管理员最后登录时间、Ip与登录次数(字段说明,请看数据字典) fields = { 'last_login_time': 'now()', 'last_login_ip': string(ip), 'login_count': 'login_count+1', } # 写入数据库 _manager_logic.edit_model(manager_id, fields) # 记录日志 _manager_operation_log_logic.add_operation_log(manager_id, manager_name, ip, '【' + manager_name + '】登陆成功') return web_helper.return_msg(0, '登录成功')