# Security ## Authentification Symfony ### Fonctionnement de base 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 login ### Connexion Switch Certains 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ôle ## Roles et Modules Les droits d'un utilisateur sont conditionnés à différents critères, dont : * Les **modules** que possède l'organisation à laquelle il est appartient * Les **rôles** de cet utilisateur au sein de cette organisation 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` ### Modules 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 : - L'appartenance des _modules_ aux _products_ - L'appartenance des _entities_ aux _modules_ 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. ## Sécurité des ressources Api-Platform > See : https://api-platform.com/docs/core/security/ 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. ## Extensions Doctrine ## Voters ## Internal Requests ## Cas particuliers ### Les Fichiers