如何解决如何在不发送密码哈希和盐的情况下将用户对象来自 Python Flask发送回前端Angular?
我使用 Flask 作为我的 Web 应用程序的 Rest API。
在前端,我经常使用 User 对象,这就是为什么我需要从后端使用它来处理用户数据。
我担心的是,用户对象具有属性 password
,当我请求用户对象时,该属性显然也会发送到前端。
我应该定义另一个像 UserPublic 这样的类来发送到前端并去掉密码,还是有更好的方法来使用 Flask、SQLAlchemy、Marshmallow 来做到这一点?
我不确定将密码 hash+salt 发送到前端是否有问题。我的意思是,我不需要它,所以为什么要发送它?无论如何,用于登录目的的密码检查都是在后端完成的。
这是我的用户类:
class User(db.Model):
__tablename__ = 'user'
user_id = db.Column(db.Integer,primary_key=True,autoincrement=True,nullable=False)
public_id = db.Column(db.String,nullable=False)
fname = db.Column(db.String,nullable=False)
lname= db.Column(db.String,nullable=False)
bday = db.Column(db.Date,nullable=False)
street = db.Column(db.String,nullable=False)
zip = db.Column(db.String,nullable=False) #Zip used
city = db.Column(db.String,nullable=False)
country = db.Column(db.String,nullable=False,default='Germany')
password = db.Column(db.String,nullable=False)
admin = db.Column(db.Boolean,default=False)
email = db.Column(db.String,nullable=False)
iban = db.Column(db.String)
bic = db.Column(db.String)
gender = db.Column(db.CHAR,default='m',nullable=False)
created_by = db.Column(db.String)
updated_by = db.Column(db.String)
membership_status_id = db.Column(db.Integer,db.ForeignKey('membership_status.membership_status_id'))
member_since = db.Column(db.Date)
bookings = db.relationship('Booking',backref="User",lazy='select')
棉花糖架构:
class UserSchema(ma.SQLAlchemyAutoSchema):
class Meta:
model = User
include_fk = True
这是获取用户对象的端点:
@app.route('/users/<public_id>',methods=['GET'])
@jwt_required
def get_user(public_id):
logger.info('Getting user with id: '+str(public_id))
current_user = User.query.filter_by(public_id=get_jwt_identity()).first()
if not current_user.admin:
return jsonify({'message' : 'Not privileged for this action'})
user = User.query.filter_by(public_id=public_id).first()
if not user:
return jsonify({'message' : 'No user found with id '+str(public_id)})
user_schema = UserSchema()
return user_schema.jsonify(user),200
解决方法
请参阅关于 overriding generated fields 的文档。
以下是从自动生成的架构中排除字段的方法:
class UserSchema(ma.SQLAlchemyAutoSchema):
class Meta:
model = User
include_fk = True
exclude = ("password",)
# You may want to only exclude id on dump but keep it on load
# In this case,add it here by calling `auto_field` yourself
password = ma.auto_field(load_only=True)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。