Использование аутентификации на разных параметрах метода (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;
}
}