2016-08-24 2 views
0

J'ai donc suivi ce tutoriel pour forcer les utilisateurs incomplets à s'inscrire s'ils viennent d'Oauth et n'ont pas d'e-mail sur leur compte facebook/twitter.Poignée Symfony ne fonctionnant pas

http://alexfu.it/2012/11/09/force-incomplete-users-to-complete-registration/

Dans la dernière étape, il est une fonction de poignée et il ne semble pas toujours être le déclenchement. Y a-t-il autre chose qui manque?

namespace FYP\UserBundle\Listener; 

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\Security\Core\Exception\AccessDeniedException; 
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface; 

class UserIncompleteListener implements AccessDeniedHandlerInterface 
{ 
    protected $security; 
    protected $router; 

    public function __construct($security, $router) 
    { 
     $this->security = $security; 
     $this->router = $router; 
    } 

    public function handle(Request $request, AccessDeniedException $accessDeniedException) 
    { 
     if(!is_null($this->security->getToken()->getUser()->getRoles()) && $this->security->getToken()->getUser()->getRoles() == array('ROLE_INCOMPLETE_USER')) { 
      return new RedirectResponse($this->router->generate('register_complete')); 
     } 
    } 
} 

Config:

fyp_user.access_denied.handler: 
     class:   FYP\UserBundle\Listener\UserIncompleteListener 
     arguments: 
      security: @security.context 
      router:  @router 

Sécurité:

firewalls: 
     main: 
      access_denied_handler: fyp_user.access_denied.handler 

Heres mon pare-feu:

firewalls: 
    main: 
     access_denied_handler: fyp_user.access_denied.handler 
     pattern: ^/ 
     anonymous: ~ 
     oauth: 
      failure_path: /login 
      login_path: /login 
      check_path: /connect_check 
      provider: fos_userbundle 
      remember_me: true 
      always_use_default_target_path: false 
      default_target_path: /login 
      resource_owners: 
       facebook: "/external-login/check-facebook" 
       paypal: "/external-login/check-paypal" 
       amazon: "/external-login/check-amazon" 
      oauth_user_provider: 
       service: app.provider.oauth 
      remember_me: 
       key:  %secret% # pararmeter 
       lifetime: 31536000 # 365 days in seconds 
       path: /
       domain: ~ 
       always_remember_me: true 
     form_login: 
      login_path: /login 
      check_path: /login_check 
      success_handler: authentication_handler 
      failure_handler: authentication_handler 
      csrf_provider: form.csrf_provider 
      remember_me: true 
     logout:  true 
     anonymous: true 
     switch_user: { role: ROLE_ALLOWED_TO_SWITCH, parameter: _new_user } 
     remember_me: 
      key:  %secret% # pararmeter 
      lifetime: 31536000 # 365 days in seconds 
      path: /
      domain: ~ 
      always_remember_me: true 

Merci!

Répondre

0

Il vous manque la balise kernel.event_listener de votre définition de service. Pour une raison quelconque, l'auteur de la publication du blog ne l'a pas ajouté.

Votre définition de service doit effectivement ressembler à ceci:

fyp_user.access_denied.handler: 
    class:   FYP\UserBundle\Listener\UserIncompleteListener 
    arguments: 
     security: @security.context 
     router:  @router 
    tags: 
     - { name: kernel.event_listener, event: kernel.exception, method: handle } 

Pour plus d'informations, jetez un oeil à Symfony docs sur events and listeners et this SO answer.

+0

Merci, j'ai ajouté cela et lu la documentation mais il ne se déclenchera pas. – Jeremy