Аутентификация Luracast Restler

Я использую Luracast Restler, и я пытаюсь реализовать некоторую аутентификацию с помощью интерфейса iAuthenticate.

Дело в том, что мой код аутентификации должен запрашивать мою базу данных, чтобы получить закрытый ключ пользователя. Этот закрытый ключ всегда будет предоставлен в URL-запросе (хешируется).

Я хотел открыть только одно соединение с базой данных для каждого запроса, поэтому мне нужно передать переменную соединения db моему классу, который реализует iAuthenticate, и другим классам, которые обрабатывают все запросы. Но я не могу понять, как я могу передать переменные в мой класс, который реализует iAuthenticate.

Является ли это возможным?

Для справки, вот примеры Luracast

Заранее спасибо.

2 ответа

Решение

Использование соединения с одной БД для вашего API и классов аутентификации

Создайте php файл с именем config.php и поместите всю свою информацию о БД вместе с подключением и выбором БД.

Например

<?php
define('DB_SERVER', 'localhost');
define('DB_USER', 'root');
define('DB_PASSWORD', 'password');
define('DB_NAME', 'mysql_db');
//initalize connection to use everywhere
//including auth class and api classes
mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD);
mysql_select_db(DB_NAME);

Включить эту функцию, используя require_once как в классе аутентификации, так и в классе API, что-то вроде (для простоты я не шифрую пароль здесь)

<?php
require_once 'config.php';
class BasicAuthentication implements iAuthenticate{
    const REALM = 'Restricted API';
    public static $currentUser;

    function __isAuthenticated(){
        if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])){
            $user = $_SERVER['PHP_AUTH_USER'];
            $pass = $_SERVER['PHP_AUTH_PW'];
            $user = mysql_real_escape_string($user);
            $pass = mysql_real_escape_string($pass);

            mysql_query("UPDATE `login` SET logged=NOW()
                WHERE user='$user' AND pass='$pass'");
            // echo mysql_affected_rows();
            if(mysql_affected_rows()>0){
                self::$currentUser = $user;
                return TRUE;
            }
        }
        header('WWW-Authenticate: Basic realm="'.self::REALM.'"');
        throw new RestException(401, 'Basic Authentication Required');
    }
}

Ваш класс API может иметь защищенный метод, который запрашивает одну и ту же базу данных, это может быть другая таблица, которая возвращает данные, используя одно и то же соединение. Для простоты здесь я использую ту же таблицу.

<?php
require_once 'config.php';
class Simple {
    function index() {
        return 'public api result';
    }
    protected function restricted() {
        $query = mysql_query("SELECT * FROM login");
        $result = array();
        while ($row = mysql_fetch_assoc($query)) {
            $result[]=$row;
        }
        return $result;
    }
}

С помощью require_once гарантирует, что файл php включается только один раз при первом обращении. Даже если мы перестанем использовать последний класс auth, наши API продолжат работать

Предполагая, что следующий SQL используется для создания нашей таблицы БД

--
-- Database: `mysql_db`
--

--
-- Table structure for table `login`
--

CREATE TABLE IF NOT EXISTS `login` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `logged` datetime DEFAULT NULL,
  `user` varchar(10) DEFAULT NULL,
  `pass` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `login`
--

INSERT INTO `login` (`id`, `logged`, `user`, `pass`) VALUES
(1, '2011-11-01 22:50:05', 'arul', 'mypass'),
(2, '2011-11-01 23:43:25', 'paulo', 'hispass');

И index.php со следующим

<?php
require_once '../../restler/restler.php';

#set autoloader
#do not use spl_autoload_register with out parameter
#it will disable the autoloading of formats
spl_autoload_register('spl_autoload');

$r = new Restler();

$r->addAPIClass('Simple','');
$r->addAuthenticationClass('BasicAuthentication');
$r->handle();

Результат

если вы откроете index.php/restricted в браузере и введите правильную комбинацию имени пользователя и пароля, вы увидите следующее:)

[
  {
    "id": "1",
    "logged": "2011-11-01 22:50:05",
    "user": "arul",
    "pass": "mypass"
  },
  {
    "id": "2",
    "logged": "2011-11-01 23:43:25",
    "user": "paulo",
    "pass": "hispass"
  }
]

Догадаться!

echo mysql_affected_rows();

Эта строка приводила к выводу в формате text/html. Прокомментировал это, и мне было хорошо идти.

Другие вопросы по тегам