Example #1
0
    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')
Example #2
0
    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)
Example #3
0
 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
Example #4
0
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
Example #5
0
    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
Example #6
0
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
Example #7
0
    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)
Example #8
0
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)
Example #9
0
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, "提交失败")
Example #10
0
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, '登录成功')