权限系统设计之Python模型代码示例

113 阅读1分钟

以下是一个详细的模型代码示例,包括用户、角色、权限、资源等模型的定义和关系:

from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
from datetime import datetime

db = SQLAlchemy()

class User(UserMixin, db.Model):
    """
    用户模型
    """
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, nullable=False)
    password_hash = db.Column(db.String(128), nullable=False)
    email = db.Column(db.String(128), unique=True, nullable=False)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'), nullable=False)
    created_at = db.Column(db.DateTime(), default=datetime.utcnow, nullable=False)

    @property
    def password(self):
        raise AttributeError('password is not a readable attribute')

    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)

class Role(db.Model):
    """
    角色模型
    """
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, nullable=False)
    permissions = db.relationship('Permission', backref='role', lazy='dynamic')

class Permission(db.Model):
    """
    权限模型
    """
    __tablename__ = 'permissions'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, nullable=False)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'), nullable=False)
    resources = db.relationship('Resource', backref='permission', lazy='dynamic')

class Resource(db.Model):
    """
    资源模型
    """
    __tablename__ = 'resources'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, nullable=False)
    path = db.Column(db.String(128), nullable=False)
    permission_id = db.Column(db.Integer, db.ForeignKey('permissions.id'), nullable=False)

上述代码中定义了四个模型,分别为用户、角色、权限和资源。用户和角色之间是一对多的关系,即一个角色可以对应多个用户。角色和权限之间也是一对多的关系,即一个角色可以有多个权限。权限和资源之间是一对多的关系,即一个权限可以对应多个资源。

在上述代码中,用户模型还继承了Flask-Login提供的UserMixin类,用于实现用户登录认证功能。同时,还定义了一些属性和方法,如密码加密、密码校验等,以及一些关系属性,如用户和角色之间的关系。在实际应用中,还需要根据业务需求进行适当的扩展和优化。