Skip to content

权限拦截

前端发送请求

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 是一种用于设计权限的一种思想,流程图如下

image-20220530190840467

RBAC 主要有 user 用户表,role 角色表,power 权限表,以及 role-power 和 user-role 的中间关联表,但是实际上对于一般的需求,我们可以只使用 user 用户表,其余的表直接使用关系进行操作即可。

自定义权限拦截

jwt 自定义装饰器