Действительно ли необходимо, чтобы клиент был частью маршрута, учитывая, что у вас уже есть эта информация в вашем распоряжении из профиля?
Что касается обработки на уровне хранилища (как упомянуто выше), это может быть немного сложнее, так как может препятствовать доступу к данным, необходимым внутри какого-либо бизнес-процесса, а также не позволять пользователю получать к нему доступ. Конечно, вы можете создать отдельные отфильтрованные / нефильтрованные методы для обработки этого. Кроме того, это может быть способом избежать смешивания клиентских данных, когда-либо допустимого.
Большую часть времени в нашем приложении добавляется / вставляется / удаляется только элемент верхнего уровня, доступ к которому каким-то образом должен быть ограничен. Это также ограниченный набор данных, который необходимо ограничить таким образом, поэтому я обычно пишу код, который выдает исключение какого-либо вида прямо в контроллер в случае нарушения правил доступа для этого элемента.
Если правила для вашего приложения очень похожи, вы можете избежать повторения кода несколькими способами. На ум приходят пользовательский базовый класс ActionFilter или пользовательский контроллер. Если у каждой строки в вашей базе данных есть идентификатор клиента или какая-то такая схема, другой вариант будет иметь каждый объект вашего домена, реализующий интерфейс, предоставляющий этот идентификатор. Затем вы можете написать повторно используемый код (методы расширения в стиле mixin и т. Д.), Который использует этот интерфейс в качестве основы для применения различных правил безопасности.