Vue-js和Python烧瓶API架构



我是vue和flask api的新手,计划使用vue js前端和flask api创建一个博客来操作日期。

我有一些建筑问题。在flask api中,我可以基于use login创建令牌auth,并将其共享给Vue进行访问。但在flask api中,我正在处理数据,比如删除博客、编辑帖子等。所以如果终点暴露了,就说http://127.0.0.1:5000/deletePost<post_id>普通用户可以使用任何post-id点击api并将其从数据库中删除。我该如何阻止它?我只想通过管理员角色对用户进行身份验证并确保数据操作的安全。此外,我想使用flask登录当前用户来跟踪会话并显示相关的帖子和内容。

有什么建议的架构吗?

我不确定这个问题是否正确。我只是想了解这里的建筑。假设我在mongo数据库中有一个用户集合。因此,当用户使用有效用户名和密码登录时,flask将创建访问令牌,我将把它传递给Vue并存储在本地存储中。现在有一个途径,比如删除带有帖子ID的帖子,我正在从数据库中删除帖子。现在,如果删除api被暴露,一个有效的登录用户可以用他们的访问令牌用任何post-id(注意,我使用vue模板中的post-id作为标识符(触发这个删除api。它是如何保护它的?

由于您使用的是flask登录,因此您可以创建自己的用户模型。只需从UserMixin&数据库。模型在那里你可以存储用户是否是管理员。

类似这样的东西:

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(),
primary_key=False,
unique=False,
nullable=False,
default=False
)

然后你使用你的那个类来创建新的用户,在登录时将他们添加到会话&使用该类的实例调用login_user。currentuser应该允许您访问该用户,您可以简单地检查is_admin。如果有人不是管理员,你只需返回一个带有和errorstatus的响应。

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

如果这种情况经常发生,您可以创建一个装饰器来检查用户是否是admin&只需把它放在你的前排。

编辑:我想做的是这样的事情:

@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

相关内容