2015-08-10 2 views
1

У меня есть несколько ролей, которые могут получить доступ к моей службе odata и основаны на роли, мне нужно скрыть несколько столбцов. Как я могу это достичь?WebApi Odata, ограничьте несколько столбцов на основе роли пользователя

+0

Где ваш код! что вы уже пробовали? – Marusyk

+0

Итак, это то, что я пробовал: 1. Исследуемые Queryinterceptors, но они являются особенностью wcf, а не webapi. Поправьте меня, если я ошибаюсь. Я не мог найти примеры, связанные с webapi. 2. Я попытался выполнить роль в моем контроллере и написать оператор выбора linq для проецирования базового объекта. Что-то вроде: .Mydata.Select (p => new myobject {myobject.Property1 = p.property1, ....}; на основе роли. Но это дает мне ошибку, потому что я пытаюсь спроектировать существующий объект. – Maggi

+0

Have вы пытались добавить '.ToList(). Выберите (...)' для этого? Вам часто нужно переходить от sql к объектам к объектам для объектов, чтобы проектировать работу. –

ответ

0
  1. Настроить DefaultODataSerializerProvider.

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

    Override метод GetODataPayloadSerializer, получить роль по запросу, хранить его в Cusomer сериализатором, вернуть сериалайзер клиентов.

  2. Если вы возвращаете объект, переделывание ODataEntityTypeSerializer

    public override ODataEntry CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext) 
    

Override 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; 
Смежные вопросы