如何在不发送密码散列和盐的情况下将用户对象(从 Python Flask)发送回前端(Angular)?
How do i send a User object (from Python Flask) back to the frontend (Angular) without sending the password hash and salt?
我正在使用 Flask 作为 WebApp 的休息 API。
在前端我经常使用 User 对象,这就是为什么我需要从后端使用它来处理用户数据。
我担心的是,用户对象有一个属性 password
,当我请求用户对象时,它显然也被发送到前端。
我是否应该定义另一个 class 之类的 UserPublic 以发送到前端并删除密码,或者是否有更好的方法使用 Flask、SQLAlchemy、Marshmallow 来完成此操作?
我不确定将密码 hash+salt 发送到前端是否有问题。我的意思是,我在那里不需要它,所以为什么要发送它?无论如何,用于登录目的的密码检查都是在后端完成的。
这是我的用户 class:
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)
我正在使用 Flask 作为 WebApp 的休息 API。
在前端我经常使用 User 对象,这就是为什么我需要从后端使用它来处理用户数据。
我担心的是,用户对象有一个属性 password
,当我请求用户对象时,它显然也被发送到前端。
我是否应该定义另一个 class 之类的 UserPublic 以发送到前端并删除密码,或者是否有更好的方法使用 Flask、SQLAlchemy、Marshmallow 来完成此操作?
我不确定将密码 hash+salt 发送到前端是否有问题。我的意思是,我在那里不需要它,所以为什么要发送它?无论如何,用于登录目的的密码检查都是在后端完成的。
这是我的用户 class:
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)