Prevent user from disconnecting the external user they are currently authenticated with

master
Lars Vierbergen 7 years ago
parent 32fb26078f
commit 42b48bc79b
  1. 20
      Controller/ConnectController.php

@ -21,11 +21,12 @@
namespace vierbergenlars\AuthserverOAuthAccountBundle\Controller; namespace vierbergenlars\AuthserverOAuthAccountBundle\Controller;
use HWI\Bundle\OAuthBundle\Controller\ConnectController as BaseConnectController;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use vierbergenlars\AuthserverExternalAccountBundle\Entity\ExternalUser; use vierbergenlars\AuthserverExternalAccountBundle\Entity\ExternalUser;
use HWI\Bundle\OAuthBundle\Security\Core\Authentication\Token\OAuthToken;
use HWI\Bundle\OAuthBundle\Controller\ConnectController as BaseConnectController;
use vierbergenlars\AuthserverExternalAccountBundle\ExternalAccount\ExternalAccountProviderManager; use vierbergenlars\AuthserverExternalAccountBundle\ExternalAccount\ExternalAccountProviderManager;
use vierbergenlars\AuthserverOAuthAccountBundle\DependencyInjection\AuthserverOAuthAccountExtension; use vierbergenlars\AuthserverOAuthAccountBundle\DependencyInjection\AuthserverOAuthAccountExtension;
@ -45,6 +46,21 @@ class ConnectController extends BaseConnectController
{ {
if($externalUser->getUser() !== $this->getUser()) if($externalUser->getUser() !== $this->getUser())
throw $this->createAccessDeniedException(); throw $this->createAccessDeniedException();
$token = $this->getToken();
if($token instanceof OAuthToken) {
if('oauth_'.$token->getResourceOwnerName() === $externalUser->getProvider()) {
$resourceOwnerMap = $this->get('hwi_oauth.resource_ownermap.public');
/* @var $resourceOwnerMap \HWI\Bundle\OAuthBundle\Security\Http\ResourceOwnerMap */
$resourceOwner = $resourceOwnerMap->getResourceOwnerByName($token->getResourceOwnerName());
$userInfo = $resourceOwner->getUserInformation($token->getRawToken());
if($userInfo->getUsername() == $externalUser->getProviderRef()) {
throw $this->createAccessDeniedException('You can not disconnect the external user you are currently authenticated with.');
}
}
}
$form = $this->createForm(FormType::class); $form = $this->createForm(FormType::class);
$form->handleRequest($request); $form->handleRequest($request);