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"></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, "查询失败")
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, '用户未登录')
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, "您的登录已失效,请重新登录"))
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, "您的登录已失效,请重新登录"))
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)
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))
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 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))
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, '登录成功')