使用WCF数据服务和实体框架控制每个实体实例的字段可见性
本文关键字:实体 实例 可见性 字段 框架 数据 WCF 服务 使用 控制 | 更新日期: 2023-09-27 18:20:04
举个例子,我们有一个User实体,它有10个字段,包含名字、姓氏、电子邮件、电话等信息。四个字段将公开可见,其余六个字段需要授权订阅(例如,两个用户被标记为好友)。
以这种方式询问数据服务时:http://example.com/users?auth_token=xxx,请求者应该只看到每个用户可以访问的字段。这很像facebooksAPI的工作方式。
我经历了为WCF编写自定义数据提供程序的所有困难,然后意识到它将我的规则应用于整个集合。我需要的是集合中每个项目的规则集。我曾想过在WCF中编写钩子来变形传递回来的Message对象,但我觉得它可能有太多的相关开销。
有人知道该怎么办吗?或者甚至用一个不同的框架来满足我的需求?
这有点违背WCF DS和OData的想法。在OData中,您定义了一个模型(EDM),其中每个实体都有一组特定的属性。预期该类型的所有实例都具有所有这些属性。您可以使用开放类型(将实体类型标记为开放)来添加可选的附加属性(每个实例),但这些属性将不在模型中。
通常,这可以通过以下两种方式之一解决:
1) 将实体拆分为两种实体类型。每个人都能看到的"公共"和只有授权用户才能看到的"私人"。并在公共和私人之间拥有导航属性。在这种情况下,您甚至可以向未经授权的用户隐藏整个私有实体,这样它在模型中就看不到了。(这是非常安全的,并且仍然在模型中完全定义)。
2) 使用打开的类型和属性并仅声明公共属性,然后仅当请求针对授权用户时才使用打开的属性填充实体。这不会用额外的类型"破坏"模型,但也意味着私有属性永远不会在模型中声明,因此用户必须通过其他方式了解它们(例如,没有代码生成)。
使用自定义提供程序,您还可以实现其他功能,自定义提供程序可以根据请求更改模型。因此,在未经授权的用户情况下,您只使类型具有公共属性,而在经授权的情况下,则使类型具有所有属性。但它随后适用于该请求中该类型的所有实例(如果您真的需要,上面的#1和#2是否都允许您根据每个实例执行此操作)。这可以像#1一样安全,并且仍然是静态类型的,但它更令人困惑,因为客户端通常不希望类型在不同的请求之间变化。