# Sécurité des routes

La mise en place de la sécurité des routes fait partie de la configuration des routes.

# Définir des droits

La définition des droits se fait dans un fichier de configuration XML comme pour les routes.

Les droits sont composés de

  • accesses/@namespace : namespace du droit
  • accesses/access/@name : référence du droit
  • accesses/access/description : description textuelle du droit
<sde:config xmlns:sde="https://platform.anakeen.com/4/schemas/sde/1.0">
    <sde:accesses namespace="MyAccesses">
        <sde:access name="user">
            <sde:description>Normal Access</sde:description>
        </sde:access>
        <sde:access name="admin">
            <sde:description>Administrator Access</sde:description>
        </sde:access>
    </sde:accesses>
</sde:config>

La référence complète d'un droit est NAMESPACE::NAME;

# Affectation des droits à des comptes

L'affectation d'un droit est fait par les attributs suivants :

  • accesses/@namespace : namespace du droit
  • accesses/route-access/@ref : référence du droit à poser
  • accesses/route-access/@account : référence système du compte (login pour les utilisateurs)
<sde:config xmlns:sde="https://platform.anakeen.com/4/schemas/sde/1.0">
    <sde:accesses namespace="MyAccesses">
        <!-- add privilege "MyAccesses::user" to big boss role -->
        <sde:route-access ref="user" account="bigboss"/>
    </sde:accesses>
</sde:config>

# Suppression de droits à des comptes

La suppression de droit est fait en utilisant l'attribut accesses/route-access/@policy.




 



<sde:config xmlns:sde="https://platform.anakeen.com/4/schemas/sde/1.0">
    <sde:accesses namespace="MyAccesses">
        <!-- delete privilege "MyAccesses::user" to big boss role -->
        <sde:route-access ref="user" account="bigboss" policy="delete"/>
    </sde:accesses>
</sde:config>

# requiredAccess

La propriété requiredAccess indique si la route nécessite un droit particulier pour être exécutée. Si la valeur est null aucun droit n'est vérifié. Si la propriété est différente de false alors la propriété authenticated doit forcément être à true (ce qui est la valeur par défaut). En effet, un accès non authentifié ne peut pas prétendre avoir un contrôle d'accès lié à un profil d'utilisateur. Dans le cas contraire, une erreur sera déclenchée.

La syntaxe pour la description d'un droit est soit une chaîne de caractères indiquant le droit nécessaire soit une liste de droits en cas de vérification plus complexe. Cette liste de droits peut désigner un des droits à posséder (or) ou tous les droits à posséder (and) sous la forme d'un objet en JSON ayant pour clef la politique de droit (or ou and) et un tableau non indexé de droits (voir exemple ci-dessous).

Le droit à indiquer doit être un des identifiants des droits enregistrés. L'enregistrement des droits est indiqué dans le chapitre Configuration des droits d'accès.

Exemple :

Pattern résultat
null Pas de vérification
true Non valide => Erreur HTTP 400
my:firstRight Le droit my:firstRight est requis
{"or":["my:firstRight", "my:otherRight"]} Le droit my:firstRight ou my:otherRight est requis
{"and":["my:firstRight", "my:otherRight"]} Les droits my:firstRight et my:otherRight sont requis
<sde:config xmlns:sde="https://platform.anakeen.com/4/schemas/sde/1.0">
    <sde:routes namespace="My">
        <sde:route name="welcomeUser">
            <sde:callable>\My\Routes\Welcome</sde:callable>
            <sde:method>GET</sde:method>
            <sde:pattern>/autotest/welcome</sde:pattern>
            <sde:requiredAccess>
                <sde:access ns="MyAccesses">user</sde:access>
            </sde:requiredAccess>
        </sde:route>


        <sde:route name="welcomeUserAndAdmin">
            <sde:callable>\My\Routes\Welcome</sde:callable>
            <sde:method>GET</sde:method>
            <sde:pattern>/autotest/welcome</sde:pattern>
            <sde:requiredAccess>
                <sde:access ns="MyAccesses">user</sde:access>
                <sde:access ns="MyAccesses">admin</sde:access>
            </sde:requiredAccess>
        </sde:route>


        <sde:route name="welcomeUserOrAdmin">
            <sde:callable>\My\Routes\Welcome</sde:callable>
            <sde:method>GET</sde:method>
            <sde:pattern>/autotest/welcome</sde:pattern>
            <sde:requiredAccess operator="or">
                <sde:access ns="MyAccesses">user</sde:access>
                <sde:access ns="MyAccesses">admin</sde:access>
            </sde:requiredAccess>
        </sde:route>
    </sde:routes>
</sde:config>

# authenticated

Permet d'indiquer que la connexion est authentifiée avant d'exécuter la route. Par défaut, une route est authentifiée sauf si cette propriété a la valeur false.

Route non authentifiée

Si la route n'est pas authentifiée, le contexte n'est pas initialisé. Par conséquent, aucune méthode nécessitant un contrôle d'accès ne peut être utilisée.

Exemple d'initialisation d'un contexte :

$user = \Anakeen\Core\AccountManager::getAccount("login utilisateur")

if ($user) {
    \Anakeen\Core\ContextManager::initContext($user);
}

Dans le cas où une route non authentifiée est utilisée, le code appelé par la route ne doit pas appartenir à la plateforme (Afin de ne pas avoir à initialiser un contexte)

Une route authentifiée permet d'avoir accès à l'utilisateur connecté.

TIP

Une route avec un requiredAccess doit forcément être authentifiée.

Une route non authentifiée ne peut accéder à aucun Smart Element contrôlé.

Exemple de route non authentifiée :

<sde:config xmlns:sde="https://platform.anakeen.com/4/schemas/sde/1.0">
    <sde:routes namespace="My">
        <sde:route name="openBar">
            <sde:callable>\My\Routes\OpenBar</sde:callable>
            <sde:method>GET</sde:method>
            <sde:pattern>/very/welcome</sde:pattern>
            <sde:authenticated>false</sde:authenticated>
        </sde:route>
    </sde:routes>
</sde:config>