Привет всем разработчикам DevExpress! =)
Я пытаюсь приручить Экспресс постоянные объекты удаленно.
На самом деле XPO допускает два разных подхода - прямой доступ к базе данных и через WebService / WCF.
В целях безопасности мы выбрали второй вариант. Теперь WCF обертывает доступ к базе данных, и клиенты должны аутентифицировать себя для доступа к базе данных.
Программное обеспечение является системой управления документами. Поэтому его основными таблицами базы данных (классы, унаследованные от XpObject) являются «Документы» и «Пользователи». У нас также есть дополнительная таблица (класс XPO), «DocumentUserAccess», которая связывает пользователей и документы вместе посредством ассоциаций. Клиенты получают данные через XPCollections.
Даже если клиенты должны проходить аутентификацию сейчас, мы должны ограничить их доступ к некоторым документам (в то время как администраторы должны иметь доступ ко всем документам).
Часть веб-сервиса содержит следующий код для обеспечения удаленного доступа к XPO:
Private Function Common_IDataStoreContract_ModifyData(ByVal ParamArray dmlStatements As ModificationStatement()) As ModificationResult Implements IDataStoreContract.ModifyData
Return wrappedDataStore.ModifyData(dmlStatements)
End Function
Private Function Common_IDataStoreContract_SelectData(ByVal ParamArray selects As SelectStatement()) As SelectedData Implements IDataStoreContract.SelectData
Dim data As SelectedData = wrappedDataStore.SelectData(selects)
Return data
End Function
И довольно просто ограничить доступ к некоторым ТАБЛИЦАМ:
For Each statement In dmlStatements
If Not UserCanAccessTable(OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name, statement.TableName) Then
Throw New Security.SecurityAccessDeniedException("You aren't allowed to modify this table.")
End If
Next
НО, мы не можем понять, как ограничить доступ к некоторым рядам.
Как видно выше, все критерии и другие параметры клиентского запроса доступны в операторах (класс DevExpress.XPO.DB.ModificationStatement).
В то же время, как проверить, запрашивает ли пользователь конкретный документ? Клиенты могут использовать различные критерии для получения документов, а не только OID и имена. Например, клиент может запросить сбор документов на основе диапазона дат.
Таким образом, до тех пор, пока запрос к базе данных не будет выполнен, мы не можем выяснить, какие строки клиент получит или изменит, и мы не можем проверить, доступны ли ему эти строки.
Любая помощь будет очень признательна.
Спасибо,
John