На основе ответа @eResourcesInc, потому что я хотел ограничить запрос определенными доверенными клиентами (например, некоторыми родственными серверами, использующими API), вот что я придумал:
Создал новую запись в файле .env
с моимтребуемые имена хостов доверенных клиентов
TRUSTED_CLIENTS=specific.example.com|*.whatever.net|8-8-8-8.static.example.org
Затем создал TrustedAccess
промежуточное ПО в App\Http\Middleware\TrustedAccess.php
namespace App\Http\Middleware;
use Illuminate\Http\Response;
use Closure;
class TrustedAccess
{
private $trustedClients;
public function __construct()
{
$this->trustedClients = [];
if (env('TRUSTED_CLIENTS')) {
$list = explode('|', env('TRUSTED_CLIENTS'));
if ($list !== false && !empty($list)) {
$this->trustedClients = $list;
}
}
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(env('APP_ENV')=='production') {
$clientHostname = gethostbyaddr($request->getClientIp());
$isTrusted = false;
foreach ($this->trustedClients as $trustedClientHostname) {
if (self::isHostnameMatch($clientHostname, $trustedClientHostname)) {
$isTrusted = true;
break;
}
}
if ($isTrusted) {
return $next($request);
} else {
return response()->json(['error'=>'Unauthorised'], Response::HTTP_UNAUTHORIZED);
}
} else {
return $next($request);
}
}
private static function isHostnameMatch($hostname, $trustedHostname)
{
if ($trustedHostname == '*' || $hostname == $trustedHostname) {
return true;
}
// check if wildcard subdomain
$subdomainDelimiterPosition = strpos($hostname, '.');
if(strlen($trustedHostname) < 2 || $subdomainDelimiterPosition === false) {
return false;
}
if (substr($trustedHostname, 0, 2) == '*.') {
if (substr($trustedHostname, 1) == substr($hostname, $subdomainDelimiterPosition)) {
return true;
}
}
return false;
}
}
Для Lumen я зарегистрировал промежуточное ПО с помощью клавиши быстрого доступа вфайл bootstrap/app.php
:
$app->routeMiddleware([
'trusted' => App\Http\Middleware\TrustedAccess::class,
]);
Затем я применил его к маршрутам следующим образом:
$router->get('url/I/want/to/limit', ['middleware' => 'trusted', function () {
//
}]);
Вот и все.Пожалуйста, прокомментируйте, если есть предложения!