# 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èsRead
: Accès en lecture seuleWrite
: Accès en écriture seuleReadWrite
: 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.