Intercept Login Action

February 10, 2023 ยท View on GitHub

There is a moment when you may want to intercept the login action to perform some specific login, like redirect user to another url or set user data. A simple way to intercept the login action is by creating a custom middleware, the following example shows how to set user data and redirect to anothe url.

<?php
namespace App\Middleware;

use Cake\Http\Response;
use CakeDC\Users\Utility\UsersUrl;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class BeforeLoginMiddleware implements MiddlewareInterface
{
    /**
     * My custom middleware
     *
     * @param \Psr\Http\Message\ServerRequestInterface $request The request.
     * @param \Psr\Http\Server\RequestHandlerInterface $handler The request handler.
     * @return \Psr\Http\Message\ResponseInterface A response.
     */
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        if (!(new UsersUrl())->checkActionOnRequest('login', $request)) {
            return $handler->handle($request);
        }

        if (!$request->getAttribute('session')->read('Auth')) {
            //do some logic
            $request->getAttribute('session')->write('Auth', $userIdentity);

            $response = $response->withHeader('Location', '/pages/33');
            return (new Response())->withHeader('Location', '/pages/33');
        }

        return $handler->handle($request);
    }

}