2016-03-18 4 views
2

En créant un projet avec une application frontale dans Angular et un backend API Symantony2 (2.7, doit bientôt passer à 3.3). Backend côté, j'utilise FOSRestBundle, FOSUSerBundle, LexikAuthBundle et un tas d'autres bundles cool pour les besoins de l'API REST. J'ai récemment mis en œuvre une fois Connectez-vous via les fournisseurs sociaux Google et Facebook (boutons de connexion avant, puis créer fos_user backend côté et manuellement défini à l'utilisateur juste reconnu, un JWT fourni par LexikBundle). Cela fonctionne bien avec les éléments suivants app\config\security.yml:Access_Control refuse à un utilisateur de jeton anonyme de passer par

security: 
    encoders: 
     Symfony\Component\Security\Core\User\User: plaintext 
     FOS\UserBundle\Model\UserInterface: sha512 

role_hierarchy: 
    ROLE_ADMIN:  ROLE_USER 
    ROLE_API:   ROLE_USER 
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

providers: 
    fos_userbundle: 
     id: fos_user.user_provider.username 

firewalls: 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 
    login: 
     pattern: ^/api/login 
     stateless: true 
     anonymous: true 
     form_login: 
      check_path:    /api/login_check 
      login_path:    /api/login 
      require_previous_session: false 
      username_parameter:  username 
      password_parameter:  password 
      success_handler:   lexik_jwt_authentication.handler.authentication_success 
      failure_handler:   lexik_jwt_authentication.handler.authentication_failure 
    api: 
     pattern: ^/api 
     stateless: true 
     anonymous: true 
     lexik_jwt: 
      authorization_header: 
       enabled: true 
       prefix: Bearer 
      query_parameter: 
       enabled: true 
       name: bearer 

always_authenticate_before_granting: true 
    access_control: 
     - { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/api/registration., roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/api, roles: [IS_AUTHENTICATED_FULLY, ROLE_API] } 

Cela fonctionne bien pour/api/login/itinéraires sociaux (où les données sont dans le corps, POST), mais impossible d'atteindre/api/Enregistrement :(:

INFO - Matched route "myapp_security_register". 
     Context: {"route_parameters":  {"_controller":"myapp\\CoreBundle\\Controller\\SecurityController::registerAction","_route":"myapp_security_register"},"request_uri":"http://127.0.0.1:8000/api/registration"} 
    INFO - Populated the TokenStorage with an anonymous Token. 
    ERROR - Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException: "You do not have the necessary permissions" at C:\projects\myappAPI\vendor\friendsofsymfony\rest-bundle\FOS\RestBundle\EventListener\AccessDeniedListener.php line 70 
    Context: {"exception":"Object(Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException)"} 

Je ne l'obtenir, parce que le jeton anonyme est réglé! Pourquoi access_control ne marche pas nous/api/accès d'inscription mon contrôleur? Qu'est-ce que je manque? Je peux aussi config après FOSRestBundle si elle peut aider.

Merci , Bor

Répondre

1

Il y a une faute de frappe dans votre directive access_control:

- { path: ^/api/registration., roles: ['..'] } 

... devrait être

- { path: ^/api/registration, roles: ['..'] } 
+0

Merci OK! J'ai eu cette faute de frappe, que j'ai vu et enlevé juste après avoir posté ceci. Mais ça n'a pas fonctionné non plus ... J'ai redémarré PC et relancé le serveur php intégré et il semble fonctionner maintenant comme prévu. Est-ce que security.yml est mis en cache dans dev environnement et un clear: cache aurait résolu le problème? – bohr

+0

oui la combinaison de la réparation de la faute de frappe ** et ** effacer le cache après aurait dû le résoudre :) – nifr