Vue js和Python flask API体系结构

如何解决Vue js和Python flask API体系结构

我是vue和flask API计划的新手,打算使用Vue js前端和flask API来操纵日期来构建博客

我有一些架构问题。在flask api中,我可以基于使用登录创建令牌auth,并将其共享给Vue进行访问。但是在flask api中,我正在处理数据,例如删除博客帖子,编辑帖子等。因此,如果端点暴露,请说http://127.0.0.1:5000/deletePost 普通用户可以使用任何帖子ID来访问该api并将其从数据库删除。如何停止呢?我只想验证用户身份,并仅通过管理员角色来保护数据操作。另外,我想使用flask-login当前用户来跟踪会话并显示相关的帖子和​​内容

有没有建议的体系结构?

我不确定这是否是一个有效的问题。我只是想了解这里的体系结构。假设我在mongo DB中有一个用户集合。因此,当用户使用有效的用户名和密码烧瓶登录时,将创建访问令牌,该令牌将传递给Vue并存储在本地存储中。现在有一条路线说删除帖子ID的帖子,我将从数据库删除帖子。现在,如果公开了删除api,则有效的登录用户可以使用具有其访问令牌的任何帖子ID(请注意,我使用vue模板中的帖子ID作为标识符)来触发此删除api。如何保护它?

解决方法

由于您使用烧瓶登录,因此可以创建自己的用户模型。 只需从UserMixin和db.Model继承即可。在那里,您可以存储用户是否是管理员。

类似这样的东西:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(UserMixin,db.Model):
    """User account model."""

    __tablename__ = 'flasklogin-users'
    id = db.Column(
        db.Integer,primary_key=True
    )
    name = db.Column(
        db.String(100),nullable=False,unique=False
    )
    email = db.Column(
        db.String(40),unique=True,nullable=False
    )
    password = db.Column(
        db.String(200),primary_key=False,unique=False,nullable=False
    )
    is_admin = db.Column(
        db.Boolean(),default=False
    )

然后,您可以使用该类创建新用户,将其添加到登录时的会话中,并使用该类的实例调用login_user。然后,current_user应该使您可以访问该用户,并且可以简单地检查is_admin。如果您不是管理员,则只需返回带有和errorstatus的Response。

如果您打算拥有两个以上的角色,则可以使用字符串列代替,然后检查该角色。

如果这种情况经常发生,您可以创建一个装饰器来检查用户是否是管理员,然后将其放在行的前面。

编辑: 我会做的是这样的:

@app.route('/deletepost/<post_id>',methods=['POST'])
@login_required
def delete_post():
    if not current_user.is_authenticated or not current_user.is_admin:        
        return Response(status=500)

如果这种情况经常发生,您可以将逻辑抽象成这样的装饰器:

def is_admin(fn):
    def decorate(*args,**kwargs):
        if not current_user.is_authenticated or not current_user.is_admin:        
            return Response(status=500)
        return fn(*args,**kwargs)

您可以像这样使用它:

@app.route('/deletepost/<post_id>',methods=['POST'])
@login_required
@is_admin
def delete_post():
    # do something

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?