首页 > 解决方案 > HWIOAuthBundle add token attribute after success auth

问题描述

I use HWIOAuthBundle for Symfony.

HWI\Bundle\OAuthBundle\Security\Core\Authentication\Provider\OAuthProvider.php has function "authenticate" where create and return OAuthToken.

public function authenticate(TokenInterface $token){
...
    $token = new OAuthToken($oldToken->getRawToken(), $user->getRoles());
    $token->setResourceOwnerName($resourceOwner->getName());
    $token->setUser($user);
    $token->setAuthenticated(true);
    $token->setRefreshToken($oldToken->getRefreshToken());
    $token->setCreatedAt($oldToken->getCreatedAt());

    return $token;
}

I need set some attribute to this OAuthToken like :

$token->setAttribute('name' => 'value');

How can i do this ?

I use service with only one function "loadUserByOAuthUserResponse" which return user object :

class PartnerEntityUserProvider implements OAuthAwareUserProviderInterface{
...
   public function loadUserByOAuthUserResponse(UserResponseInterface $response){
      ...
      return $user;
   }
...
}

Edited

I found solution with using service on security.interactive_login event :

config/services.yaml

services:
    App\EventListener\InteractiveLoginListener:
        tags:
            - { name: kernel.event_listener, event: security.interactive_login }

src/EventListener/InteractiveLoginListener.php

<?php

namespace App\EventListener;

use App\Entity\Perimetre;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

class InteractiveLoginListener
{
    private $security;
    private $entityManager;

    public function __construct(Security $security, EntityManagerInterface $entityManager)
    {
        $this->security = $security;
        $this->entityManager = $entityManager;
    }

    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
    {
        $this->security->getToken()->setAttribute('perimetre', $this->entityManager->getRepository(Perimetre::class)->findOneBy(['id' => $this->security->getToken()->getUser()->getFiliale()->getPerimetre()->getId()]));
    }
}

标签: symfonyhwioauthbundle

解决方案


推荐阅读