Запретить пользователю редактировать связанные записи - PullRequest
0 голосов
/ 05 января 2012

У меня есть объект домена Note, который принадлежит объекту Document. Только владелец документа может добавлять заметки, поэтому в классе Document есть метод canUserAccess (). На своем сервисном уровне я могу вызвать canUserAccess (), чтобы гарантировать, что пользователь только добавляет примечания к принадлежащим ему документам.

Это хорошо работает для создания, но я столкнулся с проблемой с моим действием редактирования заметки. На посте, viewmodel сопоставляется с объектом Note, предоставляя ему DocumentID. Проблема в том, что злоумышленник может отправить DocumentID, на который у него есть разрешение, и, таким образом, отредактировать заметку, принадлежащую документу, которого у него нет. На своем сервисном уровне я не могу надежно использовать предоставленный DocumentID, но мне нужно получить соответствующий DocumentID, чтобы убедиться, что пользователь может редактировать Заметку. Это пример:

public void editNote(Note note)
    {
        note.Document = documentRepository.Find(note.DocumentID);

        if(note.Document.canUserAccess())
    }

Как мне обойти это? Кажется, мне нужно избегать передачи DocumentID с моделью редактирования edit, но как мне гидрировать связанный Document в сервисном слое? Вероятно, есть действительно простое решение, и я просто связываю себя по кругу!

1 Ответ

0 голосов
/ 05 января 2012

Вы делаете это с помощью BindAtrribute для модели или для метода действия, добавляя белый список со свойствами, которые вы хотите связать:

для модели

[Bind(Include="NoteText,NoteTitle")] 
public Model{}

для метода действия

public ViewResult Edit([Bind(Include="NoteText,NoteTitle"]Note note)){}

или используйте черный список для свойств, которые вы не хотите связывать:

[Bind(Exclude="DocumentID")] 
public Model{}

Я бы лично использовал белый список сМодельный класс. эта статья может показаться вам интересной.Последний раздел для недостаточной публикации относится к вашему делу.

Тогда вы не передали documentID, но в своем действии вы можете сделать это:

public ViewResult Edit(Note note)
{
  Note updateNote = nodesRep.Get(note.noteID);

  if(updateNote.Document.canUserAccess())
  {
      //replace the values of the updateNote
      //you can place this line in your base Repository class 
      context.Entry<Note>(updateNote).CurrentValues.SetValues(note); //I assume EF 4.1
  }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...