Skip to content
Snippets Groups Projects
Commit c2e7a7cd authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Réparation de la redirection (vers l'URL demandée) après authentification.

parent a8cf0446
No related branches found
No related tags found
No related merge requests found
......@@ -367,7 +367,8 @@ return [
'UnicaenAuth\Provider\Role\Config' => 'UnicaenAuth\Provider\Role\ConfigServiceFactory',
'UnicaenAuth\Provider\Role\DbRole' => 'UnicaenAuth\Provider\Role\DbRoleServiceFactory',
'UnicaenAuth\Provider\Role\Username' => 'UnicaenAuth\Provider\Role\UsernameServiceFactory',
'BjyAuthorize\Service\Authorize' => 'UnicaenAuth\Service\AuthorizeServiceFactory', // surcharge!!!
'BjyAuthorize\Service\Authorize' => 'UnicaenAuth\Service\AuthorizeServiceFactory', // substituion
'zfcuser_redirect_callback' => 'UnicaenAuth\Authentication\RedirectCallbackFactory', // substituion
],
'initializers' => [
'UnicaenAuth\Service\UserAwareInitializer',
......
<?php
namespace UnicaenAuth\Authentication;
use Zend\Http\PhpEnvironment\Response;
use Zend\Mvc\Application;
use Zend\Mvc\Router\Exception;
use Zend\Mvc\Router\RouteInterface;
use ZfcUser\Options\ModuleOptions;
/**
* Buils a redirect response based on the current routing and parameters
*/
class RedirectCallback
{
/** @var RouteInterface */
private $router;
/** @var Application */
private $application;
/** @var ModuleOptions */
private $options;
/**
* @param Application $application
* @param RouteInterface $router
* @param ModuleOptions $options
*/
public function __construct(Application $application, RouteInterface $router, ModuleOptions $options)
{
$this->router = $router;
$this->application = $application;
$this->options = $options;
}
/**
* @return Response
*/
public function __invoke()
{
$routeMatch = $this->application->getMvcEvent()->getRouteMatch();
$redirect = $this->getRedirect($routeMatch->getMatchedRouteName(), $this->getRedirectRouteFromRequest());
$response = $this->application->getResponse();
$response->getHeaders()->addHeaderLine('Location', $redirect);
$response->setStatusCode(302);
return $response;
}
/**
* Return the redirect from param.
* First checks GET then POST
* @return string
*/
private function getRedirectRouteFromRequest()
{
$request = $this->application->getRequest();
$redirect = $request->getQuery('redirect');
if ($redirect && $this->routeExists($redirect)) {
return $redirect;
}
$redirect = $request->getPost('redirect');
if ($redirect && $this->routeExists($redirect)) {
return $redirect;
}
if ($redirect) {
return $redirect;
}
return false;
}
/**
* @param $route
* @return bool
*/
private function routeExists($route)
{
try {
$this->router->assemble(array(), array('name' => $route));
} catch (Exception\RuntimeException $e) {
return false;
}
return true;
}
/**
* Returns the url to redirect to based on current route.
* If $redirect is set and the option to use redirect is set to true, it will return the $redirect url.
*
* @param string $currentRoute
* @param bool $redirect
* @return mixed
*/
protected function getRedirect($currentRoute, $redirect = false)
{
$useRedirect = $this->options->getUseRedirectParameterIfPresent();
$routeExists = ($redirect && $this->routeExists($redirect));
if (!$useRedirect) {
$redirect = false;
}
elseif (!$routeExists && $redirect) {
return $redirect;
}
else {
$redirect = false;
}
switch ($currentRoute) {
case 'zfcuser/register':
case 'zfcuser/login':
case 'zfcuser/authenticate':
$route = ($redirect) ?: $this->options->getLoginRedirectRoute();
return $this->router->assemble(array(), array('name' => $route));
break;
case 'zfcuser/logout':
$route = ($redirect) ?: $this->options->getLogoutRedirectRoute();
return $this->router->assemble(array(), array('name' => $route));
break;
default:
return $this->router->assemble(array(), array('name' => 'zfcuser'));
}
}
}
<?php
namespace UnicaenAuth\Authentication;
use Zend\Mvc\Application;
use Zend\Mvc\Router\RouteInterface;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use ZfcUser\Options\ModuleOptions;
class RedirectCallbackFactory implements FactoryInterface
{
/**
* Create service
*
* @param ServiceLocatorInterface $serviceLocator
* @return mixed
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
/* @var RouteInterface $router */
$router = $serviceLocator->get('Router');
/* @var Application $application */
$application = $serviceLocator->get('Application');
/* @var ModuleOptions $options */
$options = $serviceLocator->get('zfcuser_module_options');
return new RedirectCallback($application, $router, $options);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment