Filtering d'objet selon l'utilisateur

Bonjour à tous,

Je travaille sur l’implémentation d’un système de filtrage pour un objet que j’appelle ObjetAProteger. Voici ma structure :

ObjetAProteger : L’objet principal que je souhaite protéger/filtrer.
Filtre : Un objet qui référence ObjetAProteger
LiaisonUtilisateurFiltre : Une table de jointure pour établir une relation N-N entre les utilisateurs et les filtres.

Mon objectif est d’implémenter un setSearchSpec dans la méthode postLoad pour :

Vérifier si un filtre a été créé pour l’ObjetAProteger.
Si un filtre existe, vérifier que l’utilisateur actuel est bien lié à ce filtre.
Si les deux conditions sont remplies, l’objet s’affiche.

J’ai juste vu le paragraphe Filtering dans la docs mais je ne comprends pas comment l’appliquer à mon cas. Avez-vous une doc plus détaillés à ce sujet ?

merci

Bonjour,

La search spec correspond à la clause where qui va s’appliquer au select de ObjetAProteger. Dans votre cas, vous voulez 1=1 l’utilisateur voit ObjetAProteger ou 1=0, il ne le voit pas.
1=1 peut se calculer en faisant un count(*) dans la table de jointure LiaisonUtilisateurFiltre.

c’est justement la rédaction de cette condition que je ne sais pas faire.
Dans l’exemple de la documentation il y a

setSearchSpec(getSearchSpec() + " and exists(select 1 FROM table1 where t_userAssignedId.row_id=" + getGrant().getUserId());

je ne comprends pas la syntaxe de t_userAssignedId.row_id

je comptais le modifier comme suit :

setSearchSpec(getSearchSpec() +" and exists(select 1 FROM liaison_utilisateur_filtre where obj_id="+getRowId()+" and user_id=" + getGrant().getUserId());

mais le getRowId() ne renvoi rien dans le postLoad. (obj_id et user_id) serait des colonnes de la table liaison

Bon j’ai compris mon erreur, il faut plutot modéliser comme cela :
1.ObjetFiltre :

  • Contient une clé fonctionnelle (par exemple, un nom de groupe)

  • Ne référence pas directement l’objet à protéger

  1. ObjetAProteger :

    • Contient une référence à la clé du groupe (clé fonctionnelle de l’ObjetFiltre)

    • Cette référence détermine à quel filtre l’objet est associé

  2. LiaisonUtilisateurFiltre (table de jointure) :

    • Contient une référence à la clé du groupe (clé fonctionnelle de l’ObjetFiltre)

    • Contient une référence à l’utilisateur

    • Établit ainsi la relation N-N entre les utilisateurs et les filtres

Cette structure permet :

  • À un filtre d’être associé à plusieurs objets à protéger (via la clé de groupe)

  • À un utilisateur d’être associé à plusieurs filtres (via la table de jointure)

  • De vérifier facilement si un utilisateur a accès à un objet à protéger en vérifiant la correspondance des clés de groupe

Dans l’exemple il est écrit que l’alias de la table principal est t et que les alias des objet liés est t_. Le getRowId() est t.row_id
Dans votre cas on peut aussi écrire que s’il existe une filtre

setDefaultSearchSpec(getDefaultSearchSpec() + " and t.row_id in (select obj_id from liaison_utilisateur_filtre where user_id=" + getGrant().getUserId()+")");

Pour un filtre statique utilisez setDefaultSearchSpec().

C’est clair pour la requête mais je ne sais pas ce qu’est un filtre statique (default). Dois-je l’utiliser dans mon cas ?

Oui le setSearchSpec s’applique à la Default Searchspec. Si vous ajoutez une searchspec à ce même objet en fonction d’une règle métier par exemple vous voulez sûrement que les filtres utilisateurs soient conservés. la default searchspec est le Filtre que vous appliquez par paramétrage.

Votre 2eme approche par groupe tient compte des responsabilités de l’utilisateur et peut s’appliquer.

Désolé mais je ne comprends toujours pas, le fait de mettre getGrant().getUserId() ne rends justement pas le filtre dynamique ? je peux écrire du code java dans la case Filtre ?

Le fait de mettre le userid rend le filtre dynamique (fonction de l’utilisateur qui accède à la donnée).
La case Filtre contient une syntaxe SQL uniquement. Vous avez un exemple dans le tutoriel, un filtre est positionné sur un objet hérité de TrnProduct. 3.3. Creating an inherited object | Simplicité Documentation