2013-06-04 48 views
1

我正在努力一点,可能是一件简单的事情或我误解的东西...但无论如何,首先使用Linq实体代码,我试图让我的一些表无法从客户端,没有成功。Linq安全 - 隐藏列

使用Breeze,我做了一个datacontext只保存我想暴露的dbset,很好。 但是,当我使用.expand()编写查询时。例如,假设我有一个我想公开的帖子表,以及一个我想要隐藏的所有者表。 使用类似的查询:

var query = EntityQuery 
      .from('Posts') 
      .expand('Owner'); 

我仍然可以看到所有的所有者列。

所以问题是:在Linq中,我该如何确保/保护/隐藏我想隐藏的表格和/或特定列?

经过一番挖掘,我发现的所有东西都是[JsonIgnore]属性,这对我来说似乎不够。

这样做的最好方法是什么?我觉得我失去了一些东西可能是巨大的在这里,但它的日在这里结束...

感谢

+0

为什么客户端访问模式呢? –

+0

这就是Breeze的工作原理:它根据DbContext将元数据发送到客户端,以使查询更容易编写。 – Nicolas

+0

然而,问题依然存在。你为什么将元数据发送给客户端,并且不希望他们访问表格信息?创建一个不同的DbContext,只包含应该可以从客户端访问的表和字段,这似乎是一个合理的解决方案。 –

回答

0

好显然我的问题已经在此解决: Risks of using OData and IQueryable

我只是觉得。

+0

同时检查John Papa的帖子:http://www.johnpapa.net/spajs04,并在评论中提到Martin提到DTO的问题。开门见山。 – Nicolas

+0

有关相关主题的其他有趣博客http://neverindoubtnet.blogspot.be/2013/02/the-breeze-server-it-your-way.html – Nicolas

1

如果您使用Breeze的WebApi实现,那么Breeze也支持ODataQueryOptions(see herehere)。

这允许您标记控制器方法以限制查询的解释方式。例如,要仅对您的“帖子”查询进行过滤,因此不能从任何“帖子”请求中“展开”或“选择”“所有者”,您可以执行以下操作。

[Queryable(AllowedQueryOptions=AllowedQueryOptions.Filter| AllowedQueryOptions.Top | AllowQueryOptions.Skip)] 
public IQueryable<Posts> Posts() { 
    .... 

}