flask通用rbac权限框架

这篇博客介绍了如何利用Flask框架实现一个通用的RBAC(Role-Based Access Control)权限管理框架。内容包括登录视图函数的设置,权限插件的初始化,以及配合使用的中间件和设置配置文件。此外,还提供了生成菜单的函数和简单的UI效果图,附带了一段JS代码和基础CSS样式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先是数据库表设计models.py

from . import db
import datetime


# 用户表
class Users(db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), index=True, nullable=False)
    email = db.Column(db.String(32), unique=True, nullable=False)
    password = db.Column(db.String(64), nullable=False)
    ctime = db.Column(db.DateTime, default=datetime.datetime.now)
    # 关联roles表,一对多关系
    role_id = db.Column(db.Integer, db.ForeignKey("roles.id"))
    # relationship,联查时候用到,详细见《flask插件之flask_sqlalchemy使用》中有介绍
    role = db.relationship("Roles", backref='user')
    __table_args__ = (
        # 联合唯一
        db.UniqueConstraint('id', 'name', 'email', name='uix_id_name_email'),
        # 联合索引
        db.Index('ix_id_name_eamil', 'name', 'email'),
    )

    def __repr__(self):
        return self.name


class Roles(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), index=True, nullable=True)
    # 与生成表结构无关,仅用于查询方便
    permission = db.relationship('Permission', secondary='roles2permission', backref='role')

    def __repr__(self):
        return self.name


class Permission(db.Model):
    __tablename__ = 'permission'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(32), unique=True, nullable=False)
    url = db.Column(db.String(128))
    menu_id = db.Column(db.Integer, db.ForeignKey("menus.id"))

    menu = db.relationship("Menus", backref='permission')

    def __repr__(self):
        return self.name


# roles和permisson多对多关系,flask中没有ManyToMany用法,多对多需要这么创建
class Roles2Permisson(db.Model):
    __tablename__ = 'roles2permission'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    permission_id = db.Column(db.Integer, db.ForeignKey('permission.id'))


class Menus(db.Model):
    __tablename__ = "menus"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(32), unique=True)
    # 关联menus,关联自己,用于生成子菜单
    parent = db.Column(db.Integer, db.ForeignKey("menus.id"))

    def __repr__(self):
        return self.name

login视图函数:

from flask import Blueprint, session, redirect, url_for, render_template, request
from flask.views import MethodView
import hashlib

login = Blueprint('login', __name__, url_prefix='/login')

from .middlewares import *
from ..models import *
from .. 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值