Intereting Posts

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

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

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

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

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

Для справки, здесь приведены примеры luracast

заблаговременно.

    Использование единого подключения к базе данных для классов API и проверки подлинности

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

    Например

     <?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 будет продолжать работать

    Предполагая, что для создания нашей таблицы db используется следующий 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. Прокомментировал это, и я был готов уйти.