Я хочу ограничить доступ к определенной странице для пользователей, которые либо просматривают страницу из определенных диапазонов 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
в промежуточном программном обеспечении, указанном выше.
Может ли кто-нибудь помочь понять, почему сеанс сбрасывается при перенаправлении обратно на промежуточное ПО? И как передать новое сгенерированное значение сеанса промежуточному программному обеспечению от контроллера?