промежуточное ПО для маршрутов Slim Framework

Я пытаюсь проверить, есть ли у пользователя файл загрузки с ip из белого списка.

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

  • если возникает исключение (например, пользователь не найден) Исключение не отслеживается app-> error ()
  • если я прекращаю () приложение, возникает исключение и вижу мою первую проблему
  • Я хотел бы применить это промежуточное программное обеспечение к одному маршруту, но промежуточное программное обеспечение маршрута называется ДО отправки, поэтому у меня нет доступа к запросу, и поэтому у меня нет исходного IP-адреса для проверки (и нет заголовков, чтобы получить пользователя)

Пользователь аутентифицирует себя с помощью базовой HTTP-аутентификации, здесь следует мое промежуточное ПО

namespace Safemail\Middleware;

use App\Validator;
use Safemail\Model;

class LocalizationLock extends \Slim\Middleware
{
/**
* Deny Access
*/
public function deny()
{
$this->app->halt(403, \App\Utilities::array2json(array('status' => 403, 'message' => 'You are not allowed to connect from your current ip')));
}

/**
* Localize user, if he's in the range, return true,
* otherwise return false
* @param string $username
* @param string $ip
* @return bool
* @throws \Exception
*/
protected function localize($username, $ip)
{
if (!$username = Model\User::findByUsername($username)) {
throw new \Exception('User not found');
}

// admin can upload from everywhere
if ($username->isAdmin()) {
return true;
}

$uploadRanges = $username->getUploadAllowedRanges();

/**
* Upload ranges can be either an array of ranges,
* an array of ip addresses or both.
*
* No ranges specified, allow, do a permissive check:
*  - '' (empty string)
*  - null
*  - false
*/
if (!$uploadRanges) {
return true;
}

$uploadRanges = explode('|', $uploadRanges);
foreach ($uploadRanges as $uploadRange) {
if (Validator::validateIpOverRange($ip, $uploadRange) ||
(Validator::validateIpAddress($uploadRange) && $uploadRange === $ip)) {
return true;
}
}

return false;
}

/**
* Call
* This method will check the HTTP request for source IP. If
* the request comes from an allowed ip or range, the next middleware is called. Otherwise,
* a 425 Forbidden response is returned to the client.
*/
public function call()
{
$req = $this->app->request();
$authUser = $req->headers('PHP_AUTH_USER');
if ($this->localize($authUser, $req->getIp())) {
$this->next->call();
} else {
$this->deny();
}
}
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]