# Sécurité des accès aux Smart Fields

# Droits des Smart Fields - Field Access Layer

Les droits par défaut sur les Smart Fields sont définis dans la structure dans les attributs structure-configuration/fields/field-X/@access du fichier de configuration XML.

Trois valeurs sont possibles :

  • None : Pas d'accès
  • Read : Accès en lecture seule
  • Write : Accès en écriture seule
  • ReadWrite : Accès en lecture et écriture
<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MY_ARTICLE" label="News">
        <smart:fields>
            <smart:field-set name="my_fr_info" type="frame" label="Information" access="ReadWrite">
                <smart:field-text name="my_title" label="Title" access="ReadWrite" needed="true" is-title="true"/>
                <smart:field-account name="my_writer" label="Writer" access="ReadWrite"/>
                <smart:field-longtext name="my_reporter" label="Final conclusion" access="Read" />
                <smart:field-longtext name="my_comment" label="Confidential comments" access="None" />
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

Les droits sur les champs sont contrôlés via la classe Anakeen\SmartElement. Les méthodes impactées par ces droits sont :

Méthode None Read Write ReadWrite
::getRawValue()
::getAttributeValue()
::setValue()

Ces méthodes bas-niveau ont des répercutions sur toutes les routes d'api qui utilisent ces méthodes.

# Smart Element contrôlé et non-contrôlé

Un objet de la classe Anakeen\SmartElement peut être obtenu via 2 méthodes :

  • Anakeen\SmartElementManager::getDocument() : Retourne un objet contrôlé
  • Anakeen\Core\SEManager::getDocument() : Retourne un objet non contrôlé

Un objet contrôlé vérifie les droits sur les méthodes suivantes :

  • ::getRawValue(), ::getAttributeValue()
  • ::setValue()
  • ::store(), ::modify()
  • ::duplicate()
  • ::revise()
  • ::delete(), ::undelete()
  • ::lock(), unlock()

En résumé, toute action d'écriture ou de lecture est soumise à la vérification de droits.

Un objet non-contrôlé, ne vérifie pas les droits. Les modifications peuvent être faites même si l'utilisateur connecté ne dispose pas des droits nécessaires.

La méthode Anakeen\SmartElement::disableAccessControl($disable) permet de basculer l'objet en mode non-contrôlé (disable=true). Cette méthode doit être utilisée sur des parties de code bien identifiées et doit être accompagnée d'un deuxième appel qui restaure le mode de contrôle initial.

$myElement = \Anakeen\SmartElementManager::getDocument(4567);
if ($myElement) {
  $myElement->disableAccessControl(true);
  // No controlled part
  $myElement->setValue("my_title", "Hello");
  $myElement->store();

  // Restore previous control mode
  $myElement->restoreAccessControl();
}

La méthode Anakeen\SmartElement::restoreAccessControl() permet de réinitialiser l'objet en mode contrôlé quel que soit le mode de contrôle initial.

# Répercussion des droits sur les formulaires web

Les données des Smart Elements sont utilisées pour l'affichage des formulaires web. Ces données transmises au client web sont soumises aux droits. Les Smart Field en accès None ne sont jamais transmis au client web. Par conséquent, ils ne sont pas affichés dans les formulaires.

Les Smart Field en accès Read sont transmis, mais ils sont par défaut affichés en lecture seule sur les formulaires.

Attention

Dans le cadre de l'enregistrement d'un smart Element avec le formulaire web, si le formulaire transmet des valeurs sur des Smart Fields qui sont en accès Read ou None, ces valeurs ne sont pas prises en compte. Par contre, le formulaire est quand même enregistré avec les valeurs modifiées qui sont en ReadWrite.

# Propagation des droits sur les Smart Fields

Les droits sont propagés suivant l'organisation de la structure (Smart Field de type set).

Droit du field set Droit initial Résultat
None None None
None Read None
None Write None
None ReadWrite None
- - - - - -
Read None None
Read Read Read
Read Write None
Read ReadWrite Read
- - - - - -
Write None None
Write Read None
Write Write Write
Write ReadWrite Write
- - - - - -
ReadWrite None None
ReadWrite Read Read
ReadWrite Write Write
ReadWrite ReadWrite ReadWrite

WARNING

Le résultat d'un droit propagé est toujours de niveau inférieur ou égal au niveau de droit initial.

# Calques de droits

Les calques de droits (field access layer) permettent d'augmenter les droits initiaux des Smart Fields.

Attention

Les niveaux des droits initiaux ne peuvent pas être diminués par calque. Le droit initial ReadWrite, qui est celui de plus haut niveau, ne peut pas être changé via un calque.

Les calques sont appliqués sur les droits non propagés. Les droits des calques sont Read, Write, ReadWrite. Le droit None, n'ayant aucun effet, n'est pas une possibilité du calque.

Les effets du calques sont les suivants :

Droit initial Calque Résultat
None Read Read
None Write Write
None ReadWrite ReadWrite
- - - - - -
Read Read Read
Read Write ReadWrite
Read ReadWrite ReadWrite
- - - - - -
Write Read ReadWrite
Write Write Write
Write ReadWrite ReadWrite
- - - - - -
ReadWrite Read ReadWrite
ReadWrite Write ReadWrite
ReadWrite ReadWrite ReadWrite

Plusieurs calques peuvent être appliqués sur un Smart Element. L'ordre d'application des calques n'a aucun effet sur le résultat.

Une fois les calques appliqués, les règles de propagation sont appliquées pour donner les droits finaux des Smart Fields.

# Configuration d'accès aux Smart Fields

Exemple complet de configuration

Soit la structure suivante :

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MY_ARTICLE" label="News">
        <smart:fields>
            <smart:field-set name="my_fr_info" type="frame" label="Information" access="Read">
                <smart:field-text name="my_title" label="Title" access="Read" needed="true" is-title="true"/>
                <smart:field-account name="my_writer" label="Writer" access="Read"/>
                <smart:field-account name="my_reporter" label="Reporter" access="None" multiple="true"/>
                <smart:field-account name="my_team" label="Collaborators" access="None" match="group"/>
            </smart:field-set>

            <smart:field-set name="my_tab_info" type="tab" label="Information" access="None">
                <smart:field-set name="my_f_dates" type="frame" label="Dates" access="ReadWrite">
                    <smart:field-date name="my_startdate" label="Creation article date" access="Read"/>
                     <smart:field-htmltext name="my_content" label="The article" access="Read"/>
                </smart:field-set>
                <smart:field-set name="my_f_otherdates" type="frame" label="Information" access="Read">
                    <smart:field-date name="my_deadline" access="None"/>
                     <smart:field-set name="my_a_controllers" type="array" access="Read">
                        <smart:field-account name="my_controller"  access="ReadWrite"/>
                        <smart:field-longtext name="my_controller_comment"  access="ReadWrite"/>
                     </smart:field-set>
                </smart:field-set>
            </smart:field-set>
        </smart:fields>
    </smart:structure-configuration>
</smart:config>

Les 3 calques suivants :

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:field-access-layer name="FAL_WRITER" label="Writer access" structure="MY_ARTICLE">
        <smart:description>Writer can write !</smart:description>
        <smart:field-access field="my_fr_info" access="ReadWrite"/>
        <smart:field-access field="my_content" access="ReadWrite"/>
        <smart:field-access field="my_reporter" access="Read"/>
        <smart:field-access field="my_deadline" access="Read"/>
        <smart:field-access field="my_team" access="ReadWrite"/>
    </smart:field-access-layer>

    <smart:field-access-layer name="FAL_CHIEF" label="Writer access" structure="MY_ARTICLE">
        <smart:description>Chief Writer can assign writer !</smart:description>
        <smart:field-access field="my_fr_info" access="ReadWrite"/>
        <smart:field-access field="my_title" access="ReadWrite"/>
        <smart:field-access field="my_deadline" access="ReadWrite"/>
        <smart:field-access field="my_writer" access="ReadWrite"/>
        <smart:field-access field="my_f_otherdates" access="ReadWrite"/>
    </smart:field-access-layer>


    <smart:field-access-layer name="FAL_REPORTER" label="Reporter access" structure="MY_ARTICLE">
        <smart:description>Reporter can view article content</smart:description>
        <smart:field-access field="my_tab_info" access="Read"/>
    </smart:field-access-layer>

</smart:config>

La composition des 3 calques dans une liste de calques (Field Access Layer List). Cela donne lieu à la création de 3 droits spécifiques Writer, Chief et Reporter.

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:field-access-layer-list name="FALL_ARTICLE" label="Article Field Access" structure="MY_ARTICLE">
        <smart:field-access-layer ref="FAL_WRITER" access-name="Writer"/>
        <smart:field-access-layer ref="FAL_CHIEF" access-name="Chief"/>
        <smart:field-access-layer ref="FAL_REPORTER" access-name="Reporter"/>
    </smart:field-access-layer-list>
</smart:config>

Le profil de la liste des 3 calques. Le rédacteur a le calque Writer, le rapporteur le calque Reporter et le rôle bigboss a le calque Chief. Un utilisateur ayant le rôle bigboss et étant rédacteur cumule les deux calques Writer et Chief.

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:access-configuration name="FALL_ARTICLE" profil-type="FIELDACCESSLAYERLIST" access-structure="MY_ARTICLE">
        <smart:element-access access="Writer" field="my_writer"/>
        <smart:element-access access="Chief" account="bigboss" />
        <smart:element-access access="Reporter" field="my_reporter"/>
    </smart:access-configuration>
</smart:config>

Le profil par défaut d'un article. Les rédacteurs peuvent écrire et les rapporteurs peuvent lire.

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:access-configuration name="PRF_ARTICLE" label="User itself" access-structure="MY_ARTICLE">
        <smart:description>Writer and reporter can write. Big boss can also delete article.</smart:description>
        <smart:element-access access="view" account="bigboss"/>
        <smart:element-access access="view" field="my_writer"/>
        <smart:element-access access="view" field="my_reporter"/>
        <smart:element-access access="view" field="my_team"/>
        <smart:element-access access="edit" field="my_writer"/>
        <smart:element-access access="edit" field="my_reporter"/>
        <smart:element-access access="edit" account="bigboss" />
        <smart:element-access access="delete" account="bigboss"/>
    </smart:access-configuration>
</smart:config>

Le profil par défaut de la structure article. Le rôle bigboss peut créer des articles.

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:access-configuration name="PRF_STRUCT_ARTICLE" profil-type="PFAM">
        <smart:description>Big boss can create.</smart:description>
        <smart:element-access access="create" account="bigboss"/>
        <smart:element-access access="icreate" account="bigboss"/>
    </smart:access-configuration>
</smart:config>

Et finalement, l'association par défaut à la structure

<smart:config xmlns:smart="https://platform.anakeen.com/4/schemas/smart/1.0">
    <smart:structure-configuration name="MY_ARTICLE">
        <smart:accesses>
            <smart:structure-access-configuration ref="PRF_STRUCT_ARTICLE"/>
            <smart:element-access-configuration ref="PRF_ARTICLE"/>
            <smart:field-access-configuration ref="FALL_ARTICLE"/>
        </smart:accesses>
    </smart:structure-configuration>
</smart:config>

Cette configuration donne les résultats suivants

Field Initial Propagé Writer Chief Reporter Writer + Chief
my_fr_info Read Read ReadWrite ReadWrite Read ReadWrite
/ my_title Read Read Read ReadWrite Read ReadWrite
/ my_writer Read Read Read ReadWrite Read ReadWrite
/ my_reporter None None Read None None Read
/ my_team None None ReadWrite None None ReadWrite
my_tab_info None None ReadWrite None Read ReadWrite
/ my_f_dates ReadWrite None ReadWrite None Read ReadWrite
. / my_startdate Read None Read None Read Read
. / my_content Read None ReadWrite None Read ReadWrite
/ my_f_otherdates Read None Read None Read ReadWrite
. / my_deadline None None Read None None ReadWrite
. / my_a_controllers Read None Read None Read Read
. . / my_controller ReadWrite None Read None Read Read
. . / my_controller_comment ReadWrite None Read None Read Read

Les calculs des ces droits peuvent s'avérer complexes lorsque l'on les réalise à la main, notamment lorsque l'on cumule plusieurs calques.