【问题标题】:WebApi Odata, restrict few columns based on user roleWebApi Odata,根据用户角色限制少数列
【发布时间】:2015-08-10 19:57:31
【问题描述】:

我有多个角色可以访问我的 odata 服务,根据角色,我需要隐藏几列。我怎样才能做到这一点?

【问题讨论】:

  • 你的代码在哪里!到目前为止你尝试过什么?
  • 所以,这些是我尝试过的事情: 1. 探索了 Queryinterceptors,但它们是 wcf 而不是 webapi 的一个特性。如果我错了,请纠正我。我找不到与 webapi 相关的示例。 2.我尝试在我的控制器中获取角色并编写一个linq select语句来投影基础对象。类似: .Mydata.Select(p=>new myobject {myobject.Property1=p.property1,....}; 基于角色。但这给了我一个错误,因为我正在尝试投影现有对象。跨度>
  • 您是否尝试向其中添加.ToList().Select(...)?您经常需要从 sql 更改为实体到对象再到实体才能使投影工作。
  • ToList() 的问题在于它实现了查询并且对性能产生了影响。我查询的数据类型有数百万条记录,尽管我已经定义了页面大小。
  • 也许你可以使用验证器来做到这一点? blogs.msdn.com/b/webdev/archive/2013/02/06/…。您可能能够根据您的安全规则“验证 $select、$expand 和 $filter”。不确定它的复杂程度:S

标签: odata asp.net-web-api2


【解决方案1】:
  1. 自定义 DefaultODataSerializerProvider。

    public override ODataSerializer GetODataPayloadSerializer(IEdmModel model, Type type, HttpRequestMessage request)
    

    重写 GetODataPayloadSerializer 方法,通过请求获取角色,将其存储在您的客户序列化器中,返回您的客户序列化器。

  2. 如果返回实体,自定义 ODataEntityTypeSerializer

    public override ODataEntry CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext)
    

重写 CreateEntry 方法,通过角色移除属性。喜欢:

            var idProp = selectExpandNode.SelectedStructuralProperties.FirstOrDefault(p => p.Name == "Id");
            if (idProp != null)
            {
                selectExpandNode.SelectedStructuralProperties.Remove(idProp);
            }
            ODataEntry entry = base.CreateEntry(selectExpandNode, entityInstanceContext);
            return entry;

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 2021-12-12
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2011-09-28
    • 2016-12-08
    相关资源
    最近更新 更多