L'authentification se fait via une requête POST envoyée à l'adresse /login_check avec le body suivant :
{
"username": "login",
"password": "password"
}
En cas de succès, la requête renvoie un token qui servira ensuite à l'utilisateur à s'identifier.
Les requêtes suivantes devront posséder les headers suivants :
x-accessid : l'id de l'utilisateur (ou Access)authorization : une chaine de caractères de la forme "BEARER XXXXX", où XXXXX est le token retourné par la requête de loginCertains utilisateurs (admins, familles) peuvent prendre le rôle d'un autre utilisateur via la connexion switch.
Pour ce faire, un nouveau header doit être ajouté aux requêtes :
x-switch-user: l'id de l'utilisateur dont on veut prendre le rôleLes droits d'un utilisateur sont conditionnés à différents critères, dont :
On peut obtenir la liste des modules de l'organisation et des rôles de l'utilisateur actif en son sein au moyen de la
requête : /api/my_profile
Les modules d'une organisation dépendent du produit acheté par celle-ci et des éventuels modules complémentaires. Ces deux
informations sont stoquées dans la table Settings.
Le fichier config/opentalent/products.yaml définit :
De plus, le fichier config/opentalent/modulesbyconditions.yaml complète cette configuration en définissant des modules
présentant des conditions particulières (appartenance à la CMF en particulier)
A chaque requête effectuée, la classe \App\Security\Voter\ModuleVoter vérifie si la ressource demandée appartient à un
module possédé par l'organisation de l'utilisateur. Si ce n'est pas le cas, une erreur AccessDeniedHttpException est levée.
La sécurité des ApiResources peut être définie de manière globale pour la ressource, ou pour chaque opération (Get, GetCollection, Put, Post, Delete).
Exemple :
#[ApiResource(
operations: [
new Get(
security: '(is_granted("ROLE_ORGANIZATION_VIEW") or is_granted("ROLE_ORGANIZATION")) and object.getOrganization().getId() == user.getOrganization().getId()'
),
new Put(
security: 'is_granted("ROLE_ORGANIZATION") and object.getOrganization().getId() == user.getOrganization().getId()'
)
],
)]
Dans certains cas plus complexes (ex: Access), cette configuration peut être déplacée dans un fichier de configuration
situé dans le répertoire ~/config/api_platform/ et portant le nom de la ressource.