【问题标题】:REST API. Hide "password" field on responseREST API。在响应中隐藏“密码”字段
【发布时间】:2021-04-15 12:09:42
【问题描述】:

我是 C# .Net Core 的初学者。我使用 MongoDB 来存储一些对象。为了解释我的问题,假设我在“UserController”中有两种方法:注册和获取。 当我使用注册方法时,我发送用户对象(类似的东西):

{
    id: 1,
    email: "test@test.com",
    name: "GoodUserName",
    password: "12345"
}

但是当我使用get-method时,我想隐藏密码字段,我希望得到类似的东西(没有密码):

{
    id: 1,
    email: "test@test.com",
    name: "GoodUserName"
}

我尝试使用 BsonIgnore,

Class User 
{
    ...
    [BsonIgnore]
    string password {get; set;}
    ...
}

但是当我使用注册方法时,密码字段为空。 我的问题是当我使用我的“获取”控制器时,响应的“用户”对象包括密码字段。请告诉我在回复时隐藏密码的最佳做法。

【问题讨论】:

  • 通常,您会拥有“数据传输对象 (DTO)”并将它们映射到数据库对象(有时称为“实体”)。这样,您就可以控制要隐藏(或添加)的信息。
  • 顺便说一句:我猜(并希望)这不是生产代码。你真的应该永远将纯文本密码保存到你的数据库(但这对于一系列讲座来说已经足够了)。
  • 在将对象返回给客户之前,您可以轻松地将代码中的密码字段清空
  • ^^ 对于映射,甚至还有一些库可以让这变得更容易(如“让您免于编写样板代码”):如 Mapster、AutoMapper ...
  • 为什么不使用 .net 身份?这可以为您处理很多事情,并且仍然可以自定义。对于核心,您可以在这里查看它是什么:docs.microsoft.com/en-us/aspnet/core/security/authentication/…

标签: c# asp.net mongodb rest bson


【解决方案1】:

解决问题的简单方法是在检索用户时使用排除投影来排除密码属性,如下所示:

var projection = Builders<User>.Projection.Exclude(u => u.password);

var user = (await userCollection.FindAsync(
    filter: u => u.id == 1,
    options: new FindOptions<User, User> { Projection = projection })
    ).SingleOrDefaultAsync();

但是...理想情况下,您永远不想像这样将您的数据模型/实体暴露给您的前端。您应该使用单独的视图模型或 DTO,并在进出的过程中在域实体之间进行映射。查找 CQRS 模式以获得良好的实现。

【讨论】:

    猜你喜欢
    • 2018-12-27
    • 2018-07-06
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2018-05-29
    • 2019-09-10
    相关资源
    最近更新 更多