权限拦截
前端发送请求
js
// 请求后端,验证是否已经登录
$.ajax({
type: "GET",
url: "/api/v1/user/profile",
success: function (data) {
if (data.code !== 0) {
location.href = "/view/login.html";
}
},
error: function (error) {
location.href = "/view/login.html";
},
});
后端新增 jwt 的配置参数
python
class BaseConfig:
SECRET_KEY = os.getenv("SECRET_KEY", "pear-admin-flask")
SQLALCHEMY_DATABASE_URI = ""
ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
JWT_TOKEN_LOCATION = ["headers"] // [!code ++]
JWT_ACCESS_TOKEN_EXPIRES = timedelta(days=7) // [!code ++]
对页面进行权限拦截
python
from flask import Blueprint, render_template
from flask_jwt_extended import jwt_required // [!code ++]
user_api = Blueprint("user", __name__)
@user_api.get("/user/profile")
@jwt_required()
def user_profile():
return {
"code": 0,
"msg": "获取个人数据成功",
"data": current_user.json(),
}
然后追加异常拦截装饰器
python
from flask_jwt_extended import JWTManager
from flask import redirect
from pear_admin.orms.user import UserORM
jwt = JWTManager()
@jwt.user_identity_loader
def user_identity_lookup(user):
return user.id
@jwt.user_lookup_loader
def user_lookup_callback(_jwt_header, jwt_data):
identity = jwt_data["sub"]
return UserORM.query.filter_by(id=identity).one_or_none()
@jwt.expired_token_loader
def expired_token_callback(): // [!code ++]
return {"msg": "token 已过期,请重新登录", "code": -1}, 403 // [!code ++]
@jwt.unauthorized_loader
def missing_token_callback(error): // [!code ++]
return {"msg": "操作未授权,请重新登录", "code": -1}, 403 // [!code ++]
前端 ajax 添加请求头信息
js
// 给 pear-admin-layui 的默认 ajax 请求添加权限
$.ajaxSetup({
headers: {
Authorization: "Bearer " + localStorage.getItem("access_token"),
},
});
RBAC 介绍
rbac 是一种用于设计权限的一种思想,流程图如下
RBAC 主要有 user 用户表,role 角色表,power 权限表,以及 role-power 和 user-role 的中间关联表,但是实际上对于一般的需求,我们可以只使用 user 用户表,其余的表直接使用关系进行操作即可。