2010-07-20 2 views
1

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

Répondre