Как добавить модели флеш-RBAC в существующую базу данных SQLAlchemy - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь добавить RBAC к моему существующему приложению для колб, где у меня уже есть 2 модели, которые описывают модель User и Post соответственно.Вот мой код:

# models.py

from datetime import datetime
from rpd_site import db, login_manager
from flask_login import UserMixin


# []
@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))


# Main site account table
class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
    password = db.Column(db.String(60), nullable=False)
    confirmed = db.Column(db.Boolean, nullable=False, default=0)
    posts = db.relationship('Post', backref='author', lazy=True)

    def __repr__(self):
        return f"User('{self.username}', '{self.email}', '{self.confirmed}')"


# Posts table
class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    date_posted = db.Column(db.DateTime, nullable=False, default=datetime.now) # current local time instead of .utcnow
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    image_file = db.Column(db.String(20), nullable=False, default='default_post.png')

    def __repr__(self):
        return f"Post('{self.title}', '{self.date_posted}', '{self.content[:15]}')"

Когда я попытался добавить весь отсутствующий код из здесь , я столкнулся с множеством ошибок.Особенно я не уверен, стоит ли мне импортировать UserMixin из flask_rbac или из flask_login.

Помогите мне понять, как я могу обновить мою БД с функциональностью RBAC.

1 Ответ

0 голосов
/ 03 ноября 2018

Это очень широкий вопрос, я постараюсь дать вам минимальный код, чтобы вы могли достичь RBAC.В приведенном ниже примере используется Flask-security.

from app import db
from flask_security import RoleMixin, UserMixin

# may to many association table between User and Role
roles_users = db.Table(
    'roles_users',
    db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
    db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
)

class Role(db.Model, RoleMixin):

    __tablename__ = 'role'

    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(50), unique=True)

    def __str__(self):
        return self.name

class User(db.Model, UserMixin):

    __tablename__ = 'user'

    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(255))
    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='joined'))
    def __str__(self):
        return self.email

Вы либо мигрируете, либо создаете БД на основе описанных выше моделей.Вышеприведенного будет достаточно для выполнения серверной операции для RDBC или на уровне просмотра.Затем вы можете легко назначать роли каждому пользователю, используя приведенную ниже ссылку.

Flask-security создает роль, пользователя и связывает user_id с role_id

Если вы хотите выполнить RBAC ввид, следуйте ниже.

from flask_security import login_required, roles_accepted
@app.route('/a_restricted_view/')
@login_required
@roles_accepted('role_one', 'role_two')
def a_restricted_view():
    return "I am only visible to users with role_one and role_two"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...