2011-10-26 32 views
2

我正在使用Luracast restler,并试图通过实现iAuthenticate接口来实现一些身份验证。Luracast Restler身份验证

事情是,我的身份验证代码需要查询我的数据库以检索用户私钥。该私钥总是在url请求中提供(哈希)。

我想打开一个数据库连接到每个请求,所以我需要将db连接变量传递给我的类实现iAuthenticate和处理所有请求的其他类。但我无法弄清楚如何将变量传递给实现iAuthenticate的类。

可能吗?

仅供参考,这里有提前the luracast examples

THKS。

回答

7

使用您的API和验证类

单DB连接创建一个名为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); 

包括双方身份验证类和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来创建我们的数据库表

-- 
-- 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'); 

并用以下

<?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

结果

如果您在浏览器中打开index.php/restricted并输入正确的用户名和密码组合,则会看到以下内容为t他的结果:)

[ 
    { 
    "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" 
    } 
] 
+0

嘿,这很酷!虽然还有一个问题...你会如何将上述方法扩展到AWS身份验证(http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?RESTAuthentication.html),其中包含一个日期标题(例如“日期:星期四,2008年8月14日17时08分48秒”),对其进行散列验证信息? – pkluz

+0

感谢分享! – Misiu

1

想通了!

echo mysql_affected_rows(); 

此行导致输出为文本/ html格式。评论说,和我很好去。