Bonjour à tous les développeurs DevExpress! =)DevExpress eXpress Persistent Objects (XPO) via WCF
J'essaye d'apprivoiser les Objets Persistants Express à distance.
En fait, XPO permet deux approches différentes: accéder directement à la base de données et via WebService/WCF.
Pour des raisons de sécurité, nous avons choisi la deuxième option. Maintenant, WCF encapsule l'accès à la base de données et les clients doivent s'authentifier pour accéder à la base de données.
Le logiciel est un système de gestion de documents. Par conséquent, ses tables de base de données principales (classes héritées de XpObject) sont "Documents" et "Utilisateurs". Nous avons également une table supplémentaire (classe XPO), "DocumentUserAccess", qui lie les utilisateurs et les documents ensemble par le biais d'associations. Les clients récupèrent des données via XPCollections.
Même si les clients doivent s'authentifier maintenant, nous devons restreindre leur accès à certains documents (alors que les administrateurs doivent avoir accès à tous les documents).
La partie webservice contient le code suivant pour rendre l'accès XPO à distance possible:
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
Et il est assez facile de restreindre l'accès à certaines tables:
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
MAIS, nous ne pouvons pas figure comment limiter l'accès à certaines ROWS. Comme vu ci-dessus, tous les critères et les autres paramètres de la requête client sont accessibles dans les instructions (classe DevExpress.XPO.DB.ModificationStatement).
Dans le même temps, comment vérifier si l'utilisateur demande un document spécifique? Les clients peuvent utiliser différents critères pour récupérer des documents, pas seulement des OID et des noms. Par exemple, le client peut demander la collecte de documents en fonction de la plage de dates. Donc, jusqu'à ce que la requête de la base de données soit exécutée, nous ne pouvons pas savoir quelles lignes le client va recevoir ou modifier, et nous ne pouvons pas vérifier si ces lignes lui sont accessibles.
Toute aide serait grandement appréciée.
Merci, John