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"]  
    JWT_ACCESS_TOKEN_EXPIRES = timedelta(days=7)  

对页面进行权限拦截

python
from flask import Blueprint, render_template
from flask_jwt_extended import jwt_required  

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():  
    return {"msg": "token 已过期,请重新登录", "code": -1}, 403


@jwt.unauthorized_loader
def missing_token_callback(error):  
    return {"msg": "操作未授权,请重新登录", "code": -1}, 403

前端 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 自定义装饰器