def menus(): user = current_user def check_auth(path): if user.is_active == True: if user.group_id == 1: return True all_menus = db.session.query(MenuAuth).order_by( MenuAuth.sort.asc()).all() rules_str = user.group.rules rules = [] if rules_str: rules = json.loads(rules_str) all_menu_list = [] auth_menu_list = [] for menu in all_menus: all_menu_list.append(menu.method) for rule_id in rules: if int(menu.id) == rule_id: auth_menu_list.append(menu.method) if path in all_menu_list and path not in auth_menu_list: return False return True # 获取登陆后菜单 if user.is_active == True: # 设置admin蓝图下全局变量 auth = Auth(user) menus = auth.auth_menus() return {'menus': menus, 'check_auth': check_auth} return {'check_auth': check_auth}
def post(self): # 1.获取参数 dict_data = request.json mobile = dict_data.get("mobile") password = dict_data.get("password") # 2.校验参数 if not all([mobile, password]): return jsonify(code=123, msg='手机号用户名或密码不能为空') # 使用 Auth 模块中 jwt Token 进行认证, 将 mobile 与 password 信息作为参数进行验证 # 验证通过后会返回 jwt Token return Auth().authenticate(mobile, password)
def bedore_request(): """ 这里要求在登录后才进行数据库的相关操作,所以在这里进行验证 在蓝图上设置 before_request,进行认证操作,只影响蓝图对象绑定的请求 导入 auth 模块使用 jwt 来做验证操作 :return json: """ result = Auth().identify(request) if result['code'] == 200: # 在创建 app 时,添加反爬功能时已经使用 g 绑定了 user, 这里可以不用设置了 # g.user = User.query return else: return jsonify(code=123, msg='用户未登录,没有权限进行访问')
def article_category_list(): try: title = u'文章分类' categorys_data = ArticleCategory.get_category_all() auth = Auth() categorys = auth.tree_list(categorys_data) data = { "categorys_list": categorys, } return render_template('admin/article_category_list.html', data=data, title=title) except Exception, e: app.logger.info(e)
def user(): """ 获取用户信息 :return: json """ # 进行 jwt 验证,验证通过后返回访问信息 result = Auth().identify(request) if result['code'] == 200: user = User.query.get(result.get('user_id')) user_dict = user.to_dict() response_dict = {'code': 200, 'msg': '请求成功', 'data': user_dict} return jsonify(response_dict) else: return jsonify(result)
def login(): """ 登陆成功获取到数据获取token和刷新token :return: """ res = ResMsg() data = request.get_json() userName = data['userName'] password = data["password"] citycode = data["citycode"] #role= int(data["role"]) # 未获取到参数或参数不存在 if not userName or not password or not citycode: res.update(code=ResponseCode.InvalidParameter) return res.data auth = Auth() return auth.authenticate(userName, password, citycode)
def before_request(): # 这里使用的是 jwt, 数据用户 id 从 jwt 中读取 user_id = Auth().get_jwt_data(request) if user_id: from app.models import User # g 是在 before_request 之前创建的 g.user = User.query.get(user_id) # count 变量用于计数 count = 0 # 从缓存中查询请求次数 try: count = redis_store.get("request_count:%s" % user_id) or 0 except Exception as e: # current_app 与 g 是同时创建的,生命周期相同 # 将报错信息记录在 current_app.logger,这里不能 return 否则程序会被阻断 current_app.logger.error(e) if isinstance(count, str): count = int(count) # 如果次数大于20,直接不让用户再继续了 # 这里只能等 redis 刷新之后再继续了 if count >= 20: return jsonify(code=1234, msg='请求过于频繁,请稍后尝试') # count 计数,每次登录时自增 1 count += 1 try: # 在 redis 中添加数据 user_id count 以及 redis 请求次数有效时间,单位是秒 redis_store.set("request_count:%s" % user_id, count, 5) except Exception as e: current_app.logger.error(e) # 判断用户请求是否包含有浏览器(软件信息以及 http 版本信息等)信息,不过没有,则判定为爬虫 if not request.user_agent: return jsonify('不是浏览器请求,可能是爬虫') return
import os from flask import Flask, g, session, Blueprint, render_template from flask.ext.assets import Environment from flask.ext.sqlalchemy import SQLAlchemy from htmlmin.main import minify from webassets.loaders import PythonLoader as PythonAssetsLoader from app import assets from app.utils.auth import Auth # Config app = Flask(__name__) env = os.environ.get('FACTURE_ENV', 'dev') app.config.from_object('config.%sConfig' % env.capitalize()) auth = Auth() # Models db = SQLAlchemy(app) from app.models import User # Assets assets_env = Environment(app) assets_loader = PythonAssetsLoader(assets) for name, bundle in assets_loader.load_bundles().items(): assets_env.register(name, bundle) # Import & Register Blueprints from app.users.views import users from app.home.views import home from app.organisations.views import orgs from app.invoices.views import invoices
def menu_auth(): menus = MenuAuth.query.order_by('id').all() auth = Auth() menus = auth.tree_list(menus) return render_template('admin/menu_auth.html', data=menus)
def menu_auth(): title = u"菜单管理" menus = db.session.query(MenuAuth).order_by(MenuAuth.sort.asc()).all() auth = Auth() menus = auth.tree_list(menus) return render_template('admin/menu_auth.html', data=menus, title=title)