Аутентификация Luracast Restler - PullRequest
2 голосов
/ 26 октября 2011

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

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

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

Возможно ли это?

Для справки: Примеры Luracast

Спасибо заранее.

Ответы [ 2 ]

7 голосов
/ 01 ноября 2011

Использование соединения с одной БД для вашего 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"
  }
]
1 голос
/ 31 декабря 2011

Разобрался!

echo mysql_affected_rows();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...