Comment définir les accès d’un Smart Field

Recommandation

Si vous n’êtes pas familier avec la Sécurité des accès aux Smart Fields et leur fonctionnement, il est fortement recommandé de lire la documentation associée disponible ici

Prérequis

Afin de pouvoir suivre ce guide, il faut préalablement avoir créé un formulaire (Une Smart Structure).

De plus, il faut avoir abordé la notion de Comptes : Comment créer un compte (Utilisateur / Rôle / Groupe)

Comment procéder ?

Informations

Les droits appliqués à l’aide des Field Access Layer (Calques de droit) permettent uniquement d’augmenter les droits initiaux et non pas de les diminuer.

Vous trouverez plus d’informations sur les calques de droits et leurs effets sur la documentation associée

  • Aux vues des effets des calques sur les droits, commençons par abaisser les droits de bases de la Smart Structure Consommable et Plat :





 
 
 
 
 
 
 
 
 









<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="CONSOMMABLE" label="Consommable">
        <smart:icon file="consommable.png"/>
        <smart:class>Cogip\Restauratec\SmartStructures\Consommable\ConsommableBehavior</smart:class>
        <smart:fields reset="true">
            <smart:field-set name="consommable_frame" type="frame" access="ReadWrite" label="Informations relatives au consommable">
                <smart:field-text name="consommable_title" needed="true" is-title="true" access="Read" label="Titre"/>
                <smart:field-htmltext name="consommable_description" access="Read" label="Description"/>
                <smart:field-money name="consommable_price_excl_vat" access="Read" label="Prix HT (€)"/>
                <smart:field-money name="consommable_price_incl_vat" access="Read" label="Prix TTC (€)"/>
                <smart:field-account access="Read" name="consommable_creator" label="Créateur"/>
            </smart:field-set>
        </smart:fields>
        <smart:hooks>
            <smart:field-hook event="onPreRefresh" field="consommable_price_excl_vat">
                <smart:field-callable function="::calculatePriceExclVat"/>
            </smart:field-hook>
        </smart:hooks>
        <smart:defaults/>
    </smart:structure-configuration>
</smart:config>








 
 







<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="PLAT" label="Plat">
        <smart:extends ref="CONSOMMABLE"/> <!-- La smart structure PLAT hérite de la smart structure CONSOMMABLE -->
        <smart:icon file="plat.png" />
        <smart:class>Cogip\Restauratec\SmartStructures\Plat\PlatBehavior</smart:class>
        <smart:fields reset="true">
            <smart:field-set name="consommable_frame" extended="true">
                <smart:field-enum name="plat_type" label="Type de plat" relation="Plat_Type" access="Read" />
                <smart:field-date name="plat_validity_date" label="Disponible jusqu'au" access="Read" />
            </smart:field-set>
        </smart:fields>
        <smart:hooks />
        <smart:defaults />
    </smart:structure-configuration>
</smart:config>

Créons maintenant le fichier permettant de paramétrer les droits de Smart Field avec la commande createSetting

npx @anakeen/anakeen-cli createSetting --type FieldAccess --name FALL_PLAT --associatedSmartStructure PLAT

Voici le fichier généré : src/vendor/<vendorName>/<moduleName>/SmartStructures/Plat/PlatSettings/230-FieldAccessFallPlat.xml

<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
  <smart:field-access-layer-list name="FALL_PLAT" label="FALL_PLAT"
                                 structure="PLAT">
    <!-- Les accès des utilisateurs sur les Smart Fields sont définis dans ce fichier  -->
    <!-- Lien vers le guide How To : https://documentation.ap4.anakeen.com/anakeen-platform-howto/FieldAccessLayer/#howToProceed -->
    <!-- Lien vers le manuel de référence : https://documentation.ap4.anakeen.com/anakeen-platform/security/fields/#droits-des-smart-fields-field-access-layer -->


    <!-- Permet de configurer un calque (field access layer), vous pouvez créer autant de calques que vous le souhaitez -->
    <!--
        <smart:field-access-layer name="FAL<name_field_access_layer>" label="<description>" structure="PLAT">
            <smart:description>Description of the field-access-layer</smart:description>
            <smart:field-access field="<field_1>" access="Read"/>
            <smart:field-access field="<field_2>" access="Write"/>
        </smart:field-access-layer>
    -->

    <!-- Liste tous les calques que vous avez créés au-dessus -->
    <!--
        <smart:field-access-layer-list name="FALL_PLAT_LAYER" label="<description>" structure="PLAT">
            <smart:field-access-layer ref="FAL<name_field_access_layer>" access-name="<name_of_your_element>"/>
        </smart:field-access-layer-list>
    -->

    <!-- Lie vos calques avec des comptes (role/ user/ group) -->
    <!--
        <smart:access-configuration name="FALL_PLAT_LAYER" profil-type="FIELDACCESSLAYERLIST" access-structure="PLAT">
            <smart:element-access access="<name_of_the_element_set_above>" account="<role/group/user_name>"/>
        </smart:access-configuration>
    -->

  </smart:field-access-layer-list>
</smart:config>

Définir les droits d’accès de chaque Smart Field pour chaque rôle (calques de droit / field access layer):

<?xml version="1.0" encoding="UTF-8"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:field-access-layer-list name="FALL_PLAT" label="Plat Field Access" structure="PLAT">
        <!-- Définition des droits d’accès des Smart Field pour la direction -->
        <smart:field-access-layer name="FAL_Direction" label="Direction access" access-name="Direction" structure="PLAT">
            <smart:description>Les directeurs peuvent éditer les plats</smart:description>
            <smart:field-access field="consommable_title" access="ReadWrite"/>
            <smart:field-access field="consommable_description" access="ReadWrite"/>
            <smart:field-access field="consommable_price_excl_vat" access="Read"/>
            <smart:field-access field="consommable_price_incl_vat" access="ReadWrite"/>
            <smart:field-access field="plat_type" access="ReadWrite"/>
            <smart:field-access field="plat_validity_date" access="ReadWrite"/>
        </smart:field-access-layer>

        <!-- Définition des droits d’accès des Smart Field pour les cuisiniers -->
        <smart:field-access-layer name="FAL_Cuisiniers" label="Cuisiniers access" access-name="Cuisiniers" structure="PLAT">
            <smart:description>Les cuisiniers ne peuvent que consulter les plats</smart:description>
            <smart:field-access field="consommable_title" access="Read"/>
            <smart:field-access field="consommable_description" access="Read"/>
            <smart:field-access field="consommable_price_excl_vat" access="Read"/>
            <smart:field-access field="consommable_price_incl_vat" access="Read"/>
            <smart:field-access field="plat_type" access="Read"/>
            <smart:field-access field="plat_validity_date" access="Read"/>
        </smart:field-access-layer>
    </smart:field-access-layer-list>
    <smart:access-configuration name="FALL_PLAT" profil-type="FIELDACCESSLAYERLIST" access-structure="PLAT">
      <smart:element-access access="Cuisiniers" account="role_cuisinier"/>
      <smart:element-access access="Direction" account="role_direction"/>
    </smart:access-configuration>
</smart:config>

Référencer cette liste de calques (Field Access Layer List) dans le fichier de configuration de la Smart Structure concernée src/vendor/<vendorName>/<moduleName>/SmartStructures/Plat/500-PlatSettings.xml

















 





<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0" xmlns:ui="https://platform.anakeen.com/4/schemas/ui/1.0">
    <!-- Ce fichier permet de lier votre Smart Structure avec vos "profil", "Field access layer" -->
    <!-- Lien vers le guide How To : Voir les guides sur les "profile", "Field access layer", "mask" pour voir comment configurer ce fichier -->
    <!-- Lien vers le manuel de référence : Pareil que les guides -->

    <ui:render ref="PLAT">
        <ui:render-access class="Cogip\Restauratec\SmartStructures\Plat\Render\PlatAccess"/>
    </ui:render>

    <smart:structure-configuration name="PLAT">
        <smart:accesses>
            <!-- Référence le profil de structure (type PFAM) -->
            <smart:structure-access-configuration ref="STRUCTURE_PLAT_PROFILE" />
            <!-- Référence le profil standard (PDOC) -->
            <smart:element-access-configuration ref="ELEMENT_PLAT_PROFILE" />
            <smart:field-access-configuration ref="FALL_PLAT"/>
        </smart:accesses>
    </smart:structure-configuration>

</smart:config>

Attention

Pensez à effectuer une réinstallation afin que l’application prenne en compte les modifications effectuées :

npx @anakeen/anakeen-cli deploy -c http://localhost:8080/control -s . -u admin -p anakeen --reinstall

Résultat / Vérification

Pour vérifier que ces modifications ont bien été prises en compte, créons tout d'abord un Plat :

http://localhost:8080/api/v2/smart-elements/PLAT/views/!defaultCreation.html

Une fois crée, vérifions que les droits sont bien appliqués sur les rendus de consultation et modification :

  • Avec un utilisateur ayant le rôle role_direction (édition) :

Droit direction

  • Avec un utilisateur ayant le rôle role_cuisinier (consultation) :

Droit cuisinier

La direction peut modifier n'importe quel plat en cliquant sur le bouton Modifier tandis que les cuisiniers ne peuvent que consulter les plats, ce bouton leur étant grisé.

Et ensuite ?

Comment restreindre la saisie d'un Smart Field