Exemplo n.º 1
0
def callback():
    """
    主页面获取菜单列表数据
    """
    # 检查用户权限
    _common_logic.check_user_power()

    # 获取当前用户权限
    session = web_helper.get_session()
    if session:
        _positions_logic = positions_logic.PositionsLogic()
        page_power = _positions_logic.get_page_power(session.get('positions_id'))
    else:
        page_power = ''
    if not page_power:
        return web_helper.return_msg(-404, '您的登录已超时,请重新登录')

    _menu_info_logic = menu_info_logic.MenuInfoLogic()
    # 读取记录
    result = _menu_info_logic.get_list('*', 'is_show and is_enabled', orderby='sort')
    if result:
        # 定义最终输出的html存储变量
        html = ''
        for model in result.get('rows'):
            # 检查是否有权限
            if ',' + str(model.get('id')) + ',' in page_power:
                # 提取出第一级菜单
                if model.get('parent_id') == 0:
                    # 添加一级菜单
                    temp = """
                    <dl id="menu-%(id)s">
                        <dt><i class="Hui-iconfont">%(icon)s</i> %(name)s<i class="Hui-iconfont menu_dropdown-arrow">&#xe6d5;</i></dt>
                        <dd>
                            <ul>
                    """ % {'id': model.get('id'), 'icon': model.get('icon'), 'name': model.get('name')}
                    html = html + temp

                    # 从所有菜单记录中提取当前一级菜单下的子菜单
                    for sub_model in result.get('rows'):
                        # 检查是否有权限
                        if ',' + str(sub_model.get('id')) + ',' in page_power:
                            # 如果父id等于当前一级菜单id,则为当前菜单的子菜单
                            if sub_model.get('parent_id') == model.get('id'):
                                temp = """
                                <li><a data-href="%(page_url)s" data-title="%(name)s" href="javascript:void(0)">%(name)s</a></li>
                            """ % {'page_url': sub_model.get('page_url'), 'name': sub_model.get('name')}
                                html = html + temp

                    # 闭合菜单html
                    temp = """
                            </ul>
                        </dd>
                    </dl>
                        """
                    html = html + temp

        return web_helper.return_msg(0, '成功', {'menu_html': html})
    else:
        return web_helper.return_msg(-1, "查询失败")
Exemplo n.º 2
0
def post_CheckLogin():
    # 验证当前页面是否登录入失效
    s = web_helper.get_session()
    userName = s.get('login_name')
    if userName != "":
        return web_helper.return_msg(0, '验证成功')
    else:
        return web_helper.return_msg(-1, '用户未登录')
Exemplo n.º 3
0
def validate():
    """使用勾子处理接口访问事件"""
    # response.headers['Access-Control-Allow-Origin'] = '*'
    """
        钩子函数 ,处理请求路由之前需要做什么的事情
        :return:
        """
    """使用勾子处理页面或接口访问事件"""
    # 让bottle框架支持jquery ajax的RESTful风格的PUT和DELETE等请求

    # 获取当前访问的Url路径
    path_info = request.environ.get("PATH_INFO")
    # 过滤不用做任何操作的路由(即过滤不用进行判断是否登录和记录日志的url)
    if path_info in ['/favicon.ico', '/', '/api/verify/', "/api/visitHandle/"]:
        return
    ### 记录客户端提交的参数 ###
    # 获取当前访问url路径与ip
    request_log = 'url:' + path_info + ' ip:' + web_helper.get_ip()
    try:
        # 添加json方式提交的参数
        if request.json:
            request_log = request_log + ' params(json):' + urllib.parse.unquote(
                str(request.json))
    except:
        pass
    try:
        # 添加GET方式提交的参数
        if request.query_string:
            request_log = request_log + ' params(get):' + urllib.parse.unquote(
                str(request.query_string))
        # 添加POST方式提交的参数
        if request.method == 'POST':
            request_log = request_log + ' params(post):' + urllib.parse.unquote(
                str(request.params.__dict__))
        # 存储到日志文件中
        log_helper.info(request_log)
    except:
        pass

    # 处理ajax提交的put、delete等请求转换为对应的请求路由(由于AJAX不支持RESTful风格提交,所以需要在这里处理一下,对提交方式进行转换)
    if request.method == 'POST' and request.POST.get('_method'):
        request.environ['REQUEST_METHOD'] = request.POST.get('_method', '')

    # 过滤不用进行登录权限判断的路由(登录与退出登录不用检查是否已经登录)
    url_list = ["/apiPost/login/", "/apiPost/logout/"]
    if path_info in url_list:
        pass
    else:
        # 已经登录成功的用户session肯定有值,没有值的就是未登录
        session = web_helper.get_session()
        # 获取用户id
        manager_id = session.get('id', 0)
        login_name = session.get('login_name', 0)
        # 判断用户是否登录
        if not manager_id or not login_name:
            web_helper.return_raise(
                web_helper.return_msg(-404, "您的登录已失效,请重新登录"))
Exemplo n.º 4
0
def validate():
    """使用勾子处理接口访问事件"""
    r = request
    # 获取当前访问的Url路径
    path_info = request.environ.get("PATH_INFO")
    # 过滤不用做任何操作的路由(即过滤不用进行判断是否登录和记录日志的url)
    if path_info in ['/favicon.ico', '/', '/api/verify/'
                     ] or path_info.find('/upload/') > -1:
        return
    ### 记录客户端提交的参数 ###
    # 获取当前访问url路径与ip
    request_log = 'url:' + path_info + ' ip:' + web_helper.get_ip()
    try:
        # 添加json方式提交的参数
        if request.json:
            request_log = request_log + ' params(json):' + urllib.parse.unquote(
                str(request.json))
    except:
        pass
    try:
        # 添加GET方式提交的参数
        if request.query_string:
            request_log = request_log + ' params(get):' + urllib.parse.unquote(
                str(request.query_string))
        # 添加POST方式提交的参数
        if request.method == 'POST':
            request_log = request_log + ' params(post):' + urllib.parse.unquote(
                str(request.params.__dict__))
        # 存储到日志文件中
        log_helper.info(request_log)
    except:
        pass

    # 处理ajax提交的put、delete等请求转换为对应的请求路由(由于AJAX不支持RESTful风格提交,所以需要在这里处理一下,对提交方式进行转换)
    if request.method == 'POST' and request.POST.get('_method'):
        request.environ['REQUEST_METHOD'] = request.POST.get('_method', '')

    # 过滤不用进行登录权限判断的路由(登录与退出登录不用检查是否已经登录)
    url_list = [
        "/api/login/", "/api/logout/", "/api/about/", "/api/contact_us/",
        "/api/product_class/", "/api/product/"
    ]
    if path_info in url_list or (request.method == 'GET'
                                 and path_info.find('/api/product/') > -1):
        pass
    else:
        # 已经登录成功的用户session肯定有值,没有值的就是未登录
        session = web_helper.get_session()
        # 获取用户id
        manager_id = session.get('id', 0)
        login_name = session.get('login_name', 0)
        # 判断用户是否登录
        if not manager_id or not login_name:
            web_helper.return_raise(
                web_helper.return_msg(-404, "您的登录已失效,请重新登录"))
Exemplo n.º 5
0
Arquivo: main.py Projeto: xjh1230/cet
def validate():
    """使用勾子处理接口访问事件"""
    r = request

    # 获取路径
    path_info = request.environ.get('PATH_INFO')
    # 记录参数
    # 图标等不用处理 直接返回
    if path_info in ['/favicon.ico', '/', '/api/verify/']:
        return
    request_log = 'url:' + path_info + ';ip:' + web_helper.get_ip()
    try:
        if request.json:
            request_log = request_log + ';params(json):' + urllib.parse.unquote(
                str(request.json))
    except:
        pass
    try:
        if request.query_string:
            request_log = request_log + ';params(get):' + request.query_string
        if request.method == 'POST':
            request_log = request_log + ';params(post):' + urllib.parse.unquote(
                str(request.params.__dict__))
        log_helper.info(request_log)
        print(request_log)
    except:
        pass

    # put等方法特殊处理
    if request.method == 'POST':
        _method = web_helper.get_form('_method', False)
        if _method:
            # if request.POST.get('_method'):
            request.environ[
                'REQUEST_METHOD'] = _method  #request.POST.get('_method', '')
            print('_method:' + _method + '|')
        # elif request.json.get()
    # 登录验证
    url_list = ["/api/login/", "/api/logout/"]
    if path_info in url_list:
        return
    else:
        s = str(api.__dict__)
        session = web_helper.get_session()
        # 获取用户id
        manager_id = session.get('id', 0)
        login_name = session.get('login_name', 0)
        print('manager_id:' + str(manager_id) + 'login_name:' +
              str(login_name))
        # 判断用户是否登录
        # if not manager_id or not login_name:
        #     web_helper.return_raise(web_helper.return_msg(-404, "您的登录已失效,请重新登录"))
        print(4)
Exemplo n.º 6
0
def get_verify():
    """生成验证码图片"""
    try:
        # 获取生成验证码图片与验证码
        code_img, verify_code = verify_helper.create_verify_code()

        # 将字符串转化成大写保存到session中
        s = web_helper.get_session()
        s['verify_code'] = verify_code.upper()
        s.save()

        # 输出图片流
        buffer = BytesIO()
        code_img.save(buffer, "jpeg")
        code_img.close()
        response.set_header('Content-Type', 'image/jpg')
        return buffer.getvalue()
    except Exception as e:
        log_helper.error(str(e.args))
Exemplo n.º 7
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)
Exemplo n.º 8
0
def check_user_power():
    """检查当前用户是否有访问当前接口的权限"""
    # 读取session
    session = web_helper.get_session()
    # session不存在则表示登录失效了
    if not session:
        web_helper.return_raise(web_helper.return_msg(-404, "您的登录已失效,请重新登录"))

    # 获取当前页面原始路由
    rule = request.route.rule
    # 获取当前访问接口方式(get/post/put/delete)
    method = request.method.lower()
    # 获取当前访问的url地址
    url = string_helper.filter_str(request.url, '<|>|%|\'')

    # 初始化日志相关变量
    _manager_operation_log_logic = manager_operation_log_logic.ManagerOperationLogLogic()
    ip = web_helper.get_ip()
    manager_id = session.get('id')
    manager_name = session.get('name')
    # 设置访问日志信息
    if method == 'get':
        method_name = '访问'
    else:
        method_name = '进行'

    # 获取来路url
    http_referer = request.environ.get('HTTP_REFERER')
    if http_referer:
        # 提取页面url地址
        index = http_referer.find('?')
        if index == -1:
            web_name = http_referer[http_referer.find('/', 8) + 1:]
        else:
            web_name = http_referer[http_referer.find('/', 8) + 1: index]
    else:
        web_name = ''

    # 组合当前接口访问的缓存key值
    key = web_name + method + '(' + rule + ')'
    # 从菜单权限缓存中读取对应的菜单实体
    _menu_info_logic = menu_info_logic.MenuInfoLogic()
    model = _menu_info_logic.get_model_for_url(key)
    if not model:
        # 添加访问失败日志
        _manager_operation_log_logic.add_operation_log(manager_id, manager_name, ip, '用户访问[%s]接口地址时,检测没有操作权限' % (url))
        web_helper.return_raise(web_helper.return_msg(-1, "您没有访问权限1" + key))

    # 初始化菜单名称
    menu_name = model.get('name')
    if model.get('parent_id') > 0:
        # 读取父级菜单实体
        parent_model = _menu_info_logic.get_model_for_cache(model.get('parent_id'))
        if parent_model:
            menu_name = parent_model.get('name').replace('列表', '').replace('管理', '') + menu_name

    # 从session中获取当前用户登录时所存储的职位id
    positions = positions_logic.PositionsLogic()
    page_power = positions.get_page_power(session.get('positions_id'))
    # 从菜单实体中提取菜单id,与职位权限进行比较,判断当前用户是否拥有访问该接口的权限
    if page_power.find(',' + str(model.get('id', -1)) + ',') == -1:
        # 添加访问失败日志
        _manager_operation_log_logic.add_operation_log(manager_id, manager_name, ip, '用户%s[%s]操作检测没有权限' % (method_name, menu_name))
        web_helper.return_raise(web_helper.return_msg(-1, "您没有访问权限2"))

    if not (method == 'get' and model.get('name') in ('添加', '编辑')):
        # 添加访问日志
        _manager_operation_log_logic.add_operation_log(manager_id, manager_name, ip, '用户%s[%s]操作' % (method_name, menu_name))
Exemplo n.º 9
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, '登录成功')