Flask用户角色与权限 #

一、角色与权限设计 #

1.1 RBAC模型 #

text
用户
    ↓
角色
    ↓
权限

1.2 数据模型 #

python
class Role(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True)
    description = db.Column(db.String(200))
    users = db.relationship('User', backref='role')

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80))
    role_id = db.Column(db.Integer, db.ForeignKey('role.id'))

二、权限检查 #

2.1 角色检查 #

python
from functools import wraps
from flask import abort
from flask_login import current_user

def role_required(role_name):
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not current_user.is_authenticated:
                abort(401)
            if current_user.role.name != role_name:
                abort(403)
            return f(*args, **kwargs)
        return decorated_function
    return decorator

@app.route('/admin')
@role_required('admin')
def admin():
    return '管理面板'

2.2 权限检查 #

python
def permission_required(permission):
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not current_user.can(permission):
                abort(403)
            return f(*args, **kwargs)
        return decorated_function
    return decorator

三、用户模型扩展 #

python
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80))
    role_id = db.Column(db.Integer, db.ForeignKey('role.id'))
    
    @property
    def is_admin(self):
        return self.role.name == 'admin'
    
    def can(self, permission):
        return self.role and permission in self.role.permissions

四、下一步 #

接下来让我们学习 API设计原则,了解RESTful API设计!

最后更新:2026-03-28