Использование аутентификации на разных параметрах метода (Restler 3)

Я хочу ограничить доступ к методу, если параметр имеет конкретное значение. Давайте возьмем для примера этот класс:

Simple.php:

class Simple
{
    function item($name)
    {
        if($name == "somerestricted")
        {
            // Here should be an authentication check (or somewhere else), hopefully, using an iAuthenticate class
            // Later, there will be a check using a database to determine if authentication will be required
            // So user/password may vary
            if($authenticated)
            {
                // Proceed
            }
            else
            {
                // ???
            }
        }
        else
        {
            echo "Hi!";
        }
    }
}

Используя этот класс аутентификации:

BasicAuthentication.php:

class BasicAuthentication implements iAuthenticate
{
    const REALM = 'Restricted API';
    function __isAllowed()
    {
        if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW']))
        {
            $user = $_SERVER['PHP_AUTH_USER'];
            $pass = $_SERVER['PHP_AUTH_PW'];
            if($user == 'laterfetched' && $pass == 'fromdatabase')
            {
                return true;
            }
        }
        header('WWW-Authenticate: Basic realm="'.self::REALM.'"');
        throw new RestException(401, 'Basic Authentication Required');
    }
}

Index.php (шлюз): addAuthenticationClass('BasicAuthentication'); $ R->addAPIClass('Simple'); $ R-> ручка ();

simple/item метод теперь общедоступен. Тем не менее, если я перехожу item это в protected функция, каждый запрос требует аутентификации. Это не то, что я хочу сделать. Только simple/item/somerestricted должен требовать аутентификации.

Так есть ли способ ограничить iAuthenticate к определенному значению параметра? Если нет, то как я могу решить эту проблему?

Имя пользователя и пароль будут различаться при производственном использовании (в зависимости от заданного параметра).

Я нашел следующие важные вопросы: Базовая аутентификация Restler 3.0 и Аутентификация Luracast Restler

Я использую Рестлер RC4.

1 ответ

Решение

Вы сделали свой гибридный API-интерфейс, который является общедоступным и улучшит результаты, если пользователь будет аутентифицирован

Один из способов сделать это, как указано ниже. Это использует скрытое свойство в Рестлере

class Simple
{
    /**
     * @var \Luracast\Restler\Restler
     */
    public $restler;
    /**
     * @access hybrid
     */
    function item($name)
    {
        if ($name == "somerestricted") {
            if ($this->restler->_authenticated) {
                // Proceed
            } else {
                // ???
            }
        } else {
            echo "Hi!";
        }
    }
}

Другой (рекомендуемый) способ - использовать интерфейс iUseAuthentication.

use Luracast\Restler\iUseAuthentication;

class Simple implements iUseAuthentication
{
    protected $authenticated;

    /**
     * @access hybrid
     */
    function item($name)
    {
        if ($name == "somerestricted") {
            if ($this->authenticated) {
                // Proceed
            } else {
                // ???
            }
        } else {
            echo "Hi!";
        }
    }

    public function __setAuthenticationStatus($isAuthenticated = false)
    {
        $this->authenticated = $isAuthenticated;
    }
}
Другие вопросы по тегам