Laravel переносить пользовательские значения из контроллера в промежуточное ПО - PullRequest
0 голосов
/ 06 августа 2020

Я хочу ограничить доступ к определенной странице для пользователей, которые либо просматривают страницу из определенных диапазонов IP-адресов, либо у них есть действующая учетная запись с аутентификацией Google SSO.

Теперь я выполнил все шаги по установке и настройке Socialite plugin, и я намереваюсь управлять хранением и извлечением любых пользовательских значений (например, google_id / google_user_email) с использованием PHP / Laravel Session вместо DB.

Но проблема в том, что я пытаюсь передать недавно созданный пользовательский значение сеанса от контроллера к промежуточному программному обеспечению оно не работает, потому что, возможно, значения сеанса сбрасываются при перенаправлении обратно на промежуточное программное обеспечение.

Ниже приведены файлы промежуточного программного обеспечения и контроллера, которые у меня есть:

<?php

namespace App\Http\Middleware;

use Closure;
use Session;
use Illuminate\Http\Request;
use App\Contracts\CustomContract;
use Illuminate\Support\Facades\Route;

class PageMiddleware
{
    /**
     * Valid IP Ranges for Logs module.
     */
    private const VALID_CIDRs = [
        'x.x.x.x/x',
        'y.y.y.y/y',
        ....
    ];

    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
         var_dump($request->session()->get('google_user_email'));die;
        $site = resolve(CustomContract::class)->getViewDirectoryName();
        if ($request->getRequestUri() == '/logs' && !self::isIpInCidrs($request->ip(), self::VALID_CIDRs)) {
            return redirect('/auth/google');
            // return response()->view($site.'.errors.403', [], 403);
        }
        return $next($request);
    }

    /**
     * Checks if a given IP address matches the specified CIDR subnet/s
     *
     * @param string $ip The IP address to check
     * @param mixed $cidrs The IP subnet (string) or subnets (array) in CIDR notation
     * @param string $match optional If provided, will contain the first matched IP subnet
     * @return boolean TRUE if the IP matches a given subnet or FALSE if it does not
     */
    private static function isIpInCidrs($ip, $cidrs, &$match = null)
    {
        foreach ((array) $cidrs as $cidr) {
            list($subnet, $mask) = explode('/', $cidr);
            if (((ip2long($ip) & ($mask = ~ ((1 << (32 - $mask)) - 1))) == (ip2long($subnet) & $mask))) {
                $match = $cidr;
                return true;
            }
        }
        return false;
    }
}

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use App\Contracts\CustomContract;

// use Auth;
use Session;
use Socialite;
use Exception;
use Illuminate\Http\Request;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/administration';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function redirectToGoogle()
    {
        return Socialite::driver('google')->redirect();
    }

    /**
     * Obtain the user information from Google.
     * @param \Illuminate\Http\Request $request
     * @return Response
     */
    public function handleGoogleCallback(Request $request)
    {
        $user = Socialite::driver('google')->stateless()->user();
        $request->session()->put('google_user_email', $user->email);
        return redirect('logs');

        $site = resolve(CustomContract::class)->getViewDirectoryName();
        return response()->view($site.'.errors.403', [], 403);
    }
}

Невозможно получить доступ к значению google_user_email в промежуточном программном обеспечении, указанном выше.

Может ли кто-нибудь помочь понять, почему сеанс сбрасывается при перенаправлении обратно на промежуточное ПО? И как передать новое сгенерированное значение сеанса промежуточному программному обеспечению от контроллера?

...