Skip to content
This repository has been archived by the owner on Apr 29, 2024. It is now read-only.

Commit

Permalink
[Security] Extract default logout success handling logic
Browse files Browse the repository at this point in the history
  • Loading branch information
asm89 committed Jul 14, 2012
1 parent 46e7e6c commit b8e3513
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 16 deletions.
16 changes: 5 additions & 11 deletions Http/Firewall/LogoutListener.php
Expand Up @@ -40,19 +40,18 @@ class LogoutListener implements ListenerInterface
* *
* @param SecurityContextInterface $securityContext * @param SecurityContextInterface $securityContext
* @param HttpUtils $httpUtils An HttpUtilsInterface instance * @param HttpUtils $httpUtils An HttpUtilsInterface instance
* @param array $options An array of options to process a logout attempt
* @param LogoutSuccessHandlerInterface $successHandler A LogoutSuccessHandlerInterface instance * @param LogoutSuccessHandlerInterface $successHandler A LogoutSuccessHandlerInterface instance
* @param array $options An array of options to process a logout attempt
* @param CsrfProviderInterface $csrfProvider A CsrfProviderInterface instance * @param CsrfProviderInterface $csrfProvider A CsrfProviderInterface instance
*/ */
public function __construct(SecurityContextInterface $securityContext, HttpUtils $httpUtils, array $options = array(), LogoutSuccessHandlerInterface $successHandler = null, CsrfProviderInterface $csrfProvider = null) public function __construct(SecurityContextInterface $securityContext, HttpUtils $httpUtils, LogoutSuccessHandlerInterface $successHandler, array $options = array(), CsrfProviderInterface $csrfProvider = null)
{ {
$this->securityContext = $securityContext; $this->securityContext = $securityContext;
$this->httpUtils = $httpUtils; $this->httpUtils = $httpUtils;
$this->options = array_merge(array( $this->options = array_merge(array(
'csrf_parameter' => '_csrf_token', 'csrf_parameter' => '_csrf_token',
'intention' => 'logout', 'intention' => 'logout',
'logout_path' => '/logout', 'logout_path' => '/logout',
'target_url' => '/',
), $options); ), $options);
$this->successHandler = $successHandler; $this->successHandler = $successHandler;
$this->csrfProvider = $csrfProvider; $this->csrfProvider = $csrfProvider;
Expand Down Expand Up @@ -95,14 +94,9 @@ public function handle(GetResponseEvent $event)
} }
} }


if (null !== $this->successHandler) { $response = $this->successHandler->onLogoutSuccess($request);
$response = $this->successHandler->onLogoutSuccess($request); if (!$response instanceof Response) {

throw new \RuntimeException('Logout Success Handler did not return a Response.');
if (!$response instanceof Response) {
throw new \RuntimeException('Logout Success Handler did not return a Response.');
}
} else {
$response = $this->httpUtils->createRedirectResponse($request, $this->options['target_url']);
} }


// handle multiple logout attempts gracefully // handle multiple logout attempts gracefully
Expand Down
47 changes: 47 additions & 0 deletions Http/Logout/DefaultLogoutSuccessHandler.php
@@ -0,0 +1,47 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\Security\Http\Logout;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\HttpUtils;
use Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface;

/**
* Default logout success handler will redirect users to a configured path.
*
* @author Fabien Potencier <fabien@symfony.com>
* @author Alexander <iam.asm89@gmail.com>
*/
class DefaultLogoutSuccessHandler implements LogoutSuccessHandlerInterface
{
protected $httpUtils;
protected $targetUrl;

/**
* @param HttpUtils $httpUtils
* @param string $targetUrl
*/
public function __construct(HttpUtils $httpUtils, $targetUrl = '/')
{
$this->httpUtils = $httpUtils;

$this->targetUrl = $targetUrl;
}

/**
* {@inheritDoc}
*/
public function onLogoutSuccess(Request $request)
{
return $this->httpUtils->createRedirectResponse($request, $this->targetUrl);
}
}
12 changes: 7 additions & 5 deletions Tests/Http/Firewall/LogoutListenerTest.php
Expand Up @@ -103,7 +103,9 @@ public function testHandleMatchedPathWithSuccessHandlerAndCsrfValidation()


public function testHandleMatchedPathWithoutSuccessHandlerAndCsrfValidation() public function testHandleMatchedPathWithoutSuccessHandlerAndCsrfValidation()
{ {
list($listener, $context, $httpUtils, $options) = $this->getListener(); $successHandler = $this->getSuccessHandler();

list($listener, $context, $httpUtils, $options) = $this->getListener($successHandler);


list($event, $request) = $this->getGetResponseEvent(); list($event, $request) = $this->getGetResponseEvent();


Expand All @@ -112,9 +114,9 @@ public function testHandleMatchedPathWithoutSuccessHandlerAndCsrfValidation()
->with($request, $options['logout_path']) ->with($request, $options['logout_path'])
->will($this->returnValue(true)); ->will($this->returnValue(true));


$httpUtils->expects($this->once()) $successHandler->expects($this->once())
->method('createRedirectResponse') ->method('onLogoutSuccess')
->with($request, $options['target_url']) ->with($request)
->will($this->returnValue($response = new Response())); ->will($this->returnValue($response = new Response()));


$context->expects($this->once()) $context->expects($this->once())
Expand Down Expand Up @@ -231,13 +233,13 @@ private function getListener($successHandler = null, $csrfProvider = null)
$listener = new LogoutListener( $listener = new LogoutListener(
$context = $this->getContext(), $context = $this->getContext(),
$httpUtils = $this->getHttpUtils(), $httpUtils = $this->getHttpUtils(),
$successHandler ?: $this->getSuccessHandler(),
$options = array( $options = array(
'csrf_parameter' => '_csrf_token', 'csrf_parameter' => '_csrf_token',
'intention' => 'logout', 'intention' => 'logout',
'logout_path' => '/logout', 'logout_path' => '/logout',
'target_url' => '/', 'target_url' => '/',
), ),
$successHandler,
$csrfProvider $csrfProvider
); );


Expand Down

0 comments on commit b8e3513

Please sign in to comment.