簡體   English   中英

Luracast Restler身份驗證

[英]Luracast Restler Authentication

我正在使用Luracast restler,我正在嘗試通過實現iAuthenticate接口來實現一些身份驗證。

問題是,我的身份驗證代碼需要查詢我的數據庫以檢索用戶私鑰。 該私鑰將始終在url請求中提供(散列)。

我想打開每個請求的一個數據庫連接,所以我需要將db連接變量傳遞給實現iAuthenticate的類和處理所有請求的其他類。 但我無法弄清楚如何將變量傳遞給實現iAuthenticate的類。

可能嗎?

作為參考,這里是luracast示例

事先說。

為您的API和身份驗證類使用單個數據庫連接

創建一個名為config.php的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);

在Authentication類和API類上使用require_once包含此函數,類似於(為簡單起見,我不在此處加密密碼)

<?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來創建我們的db表

--
-- 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格式。 評論說出來,我很高興。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM