如何在不丢失 POST 方法的情况下正确排除 Odata 中的密码 属性
How to properly exclude password property in Odata without loosing POST method
我对 OData 实体结构有点困惑。我们以用户实体为例:
public class User {
[Required]
public string Name;
[Required]
public string Surname;
[Required]
public string Password;
}
然后我们将其添加到 EDM 模型中:
var type = builder.AddEntityType(typeof(User));
builder.AddEntitySet("Users", type);
很公平,但是...当然我们不想暴露 Password
。幸运的是,有很多方法可以将 password
排除在外。
其中之一是在 return 上将其设置为 null
,我认为这感觉不对,因为该字段被标记为 Required
并且 returning null
只是感觉不对。
更常见的一种是在EDM模型中忽略它。但是该解决方案存在一个问题,即 POST
方法将不再接收创建 User
所需的所有数据。
public ActionResult<User> Post([FromBody] User user)
{
// user missing password
用户如何在不指定密码的情况下登录?
我觉得从 EDM 模型中排除密码也不是正确的方法。
理想的解决方案是使用两个 DTO's
来分隔 UserInitiator
数据结构(这将包括密码 属性 但没有其他一些属性,例如 id
) UserInfo
将包含所有 'safe to read' 数据。不幸的是,OData 似乎不允许这样的分离。
那么,我应该如何正确处理 password
属性?
您可以将用户 creation/login 添加为单独的操作,这样它就可以拥有自定义参数类型。您可以阅读有关 OData 操作的信息 here。例如,用户注册操作的 edm 可能类似于:
var action = builder.EntityType<User>().Action("Register");
action.Parameter<UserWithPwdDto>("user");
其中 User
是不包含密码 属性 的控制器的实体类型,而 UserWithPwdDto
有密码 属性 并且仅由需要 属性.
的操作
另外我希望你在问题中显示的用户 class 没有被用作你的数据库模型,你应该 永远不要 将密码保存为 plain-text你的数据库。
我对 OData 实体结构有点困惑。我们以用户实体为例:
public class User {
[Required]
public string Name;
[Required]
public string Surname;
[Required]
public string Password;
}
然后我们将其添加到 EDM 模型中:
var type = builder.AddEntityType(typeof(User));
builder.AddEntitySet("Users", type);
很公平,但是...当然我们不想暴露 Password
。幸运的是,有很多方法可以将 password
排除在外。
其中之一是在 return 上将其设置为 null
,我认为这感觉不对,因为该字段被标记为 Required
并且 returning null
只是感觉不对。
更常见的一种是在EDM模型中忽略它。但是该解决方案存在一个问题,即 POST
方法将不再接收创建 User
所需的所有数据。
public ActionResult<User> Post([FromBody] User user)
{
// user missing password
用户如何在不指定密码的情况下登录? 我觉得从 EDM 模型中排除密码也不是正确的方法。
理想的解决方案是使用两个 DTO's
来分隔 UserInitiator
数据结构(这将包括密码 属性 但没有其他一些属性,例如 id
) UserInfo
将包含所有 'safe to read' 数据。不幸的是,OData 似乎不允许这样的分离。
那么,我应该如何正确处理 password
属性?
您可以将用户 creation/login 添加为单独的操作,这样它就可以拥有自定义参数类型。您可以阅读有关 OData 操作的信息 here。例如,用户注册操作的 edm 可能类似于:
var action = builder.EntityType<User>().Action("Register");
action.Parameter<UserWithPwdDto>("user");
其中 User
是不包含密码 属性 的控制器的实体类型,而 UserWithPwdDto
有密码 属性 并且仅由需要 属性.
另外我希望你在问题中显示的用户 class 没有被用作你的数据库模型,你应该 永远不要 将密码保存为 plain-text你的数据库。