2013-02-22 12 views
6

ArangoDB는 매우 훌륭한 기능과 훌륭한 문서를 갖춘 유연한 다중 모델 데이터베이스 서버입니다. 젊고 매우 유망한 오픈 소스 프로젝트로서 성장하는 커뮤니티가 있지만 실제 사례는 많지 않습니다.ArangoDB를 사용하여 PHP에서 사용자 등록 및 인증을 수행하는 방법은 무엇입니까?

일반적인 실제 예는 사용자 등록 및 인증입니다. 대부분의 응용 프로그램에서 필요합니다.

그래서 ArangoDB를 사용하여 PHP에서 사용자 등록 및 인증을 수행하는 방법은 무엇입니까?

답변

6

다음 예제 코드를 직접 실행할 수 있으며 가상의 사용자 데이터를 제공하여 사용자 등록 및 인증을 수행합니다.
각각의 단계가 표시됩니다. 컬렉션 생성에서 사용자 등록, 인증 및 컬렉션 다시 정리.
이해하기 쉽게하기 위해 수행중인 작업을 설명하는 주석이 많이 있습니다.

이 코드를 파일에 넣기 만하면 환경에 따라 autoload.php의 경로를 구성하고 브라우저로 링크를 방문하십시오. 이 코드는 ArangoDB 1.2 and upArangoDB-PHP client version 1.2 이상이 필요합니다. 이 스크립트는 자동으로 '사용자의 수집 및'사용자 이름 '의 고유 스킵리스트 인덱스를 생성합니다
그것은 ArangoDB 로컬 호스트에서 실행하고 포트 8529.에

을 청취 할 것으로 기대하고있다. 또한 컬렉션을 마지막에 삭제합니다.
자동으로 대신 모음을 만들려면 모음 및 색인이 생성되는 부분과 모음이 삭제 된 부분을 주석 처리해야합니다. ArangoDB (arangosh)에 쉘을 열어
후 그 안에 다음 명령을 실행

arangosh> db._createDocumentCollection('users'); 
arangosh> db.users.ensureUniqueSkiplist("username"); 

당신이 수집, 유형 드롭 할 경우 :

arangosh> db.users.drop(); 


주 2을 : 나는 의도적으로 사용자 객체, 주소 객체 등과 같은 더 많은 객체 지향 스타일을 도입하는 것을 피했다. 간단하게하기 위해서.

마지막으로 여기에 스크립트가 있습니다.

<?php 

namespace triagens\ArangoDb; 


// use this and change it to the path to autoload.php of the arangodb-php client if you're using the client standalone... 
// require __DIR__ . '/../vendor/triagens/ArangoDb/autoload.php'; 

// ...or use this and change it to the path to autoload.php in the vendor directory if you're using Composer/Packagist 
require __DIR__ . '/../vendor/autoload.php'; 


// This function will provide us with our pre-configured connection options. 
function getConnectionOptions() 
{ 
    $traceFunc = function ($type, $data) { 
     print "TRACE FOR " . $type . PHP_EOL; 
    }; 

    return array(
     ConnectionOptions::OPTION_ENDPOINT  => 'tcp://localhost:8529/', 
     // endpoint to connect to 
     ConnectionOptions::OPTION_CONNECTION => 'Close', 
     // can use either 'Close' (one-time connections) or 'Keep-Alive' (re-used connections) 
     ConnectionOptions::OPTION_AUTH_TYPE  => 'Basic', 
     // use basic authorization 
     /* 
     ConnectionOptions::OPTION_AUTH_USER  => '',      // user for basic authorization 
     ConnectionOptions::OPTION_AUTH_PASSWD  => '',      // password for basic authorization 
     ConnectionOptions::OPTION_PORT   => 8529,     // port to connect to (deprecated, should use endpoint instead) 
     ConnectionOptions::OPTION_HOST   => "localhost",    // host to connect to (deprecated, should use endpoint instead) 
     */ 
     ConnectionOptions::OPTION_TIMEOUT  => 5, 
     // timeout in seconds 
     //ConnectionOptions::OPTION_TRACE   => $traceFunc,    // tracer function, can be used for debugging 
     ConnectionOptions::OPTION_CREATE  => false, 
     // do not create unknown collections automatically 
     ConnectionOptions::OPTION_UPDATE_POLICY => UpdatePolicy::LAST, 
     // last update wins 
    ); 
} 


// This function tries to persist the user data into the database upon registration 
// it will fail if a user with the same username already exists. 
function register($connection, $username, $password, $registrationData) 
{ 
    // This would be where you call the function that encrypts your password like you did for storage earlier 
    $hashedPassword = md5($password); 

    // assign the collection to a var (or type it directly into the methods parameters) 
    $collectionId = 'users'; 

    //create an example document or an array in order to pass to the following byExample method 
    $document = Document::createFromArray(
     array('username' => $username, 'password' => $hashedPassword, 'data' => $registrationData) 
    ); 

    // Get an instance of the collection handler 
    $documentHandler = new DocumentHandler($connection); 

    try { 
     // query the given $collectionId by example using the previously declared $exampleDocument array 
     $result = $documentHandler->add($collectionId, $document); 

     // return the result; 
     return $result; 
    } catch (Exception $e) { 

     if ($e->getCode()) { 
      echo ('User already exists... '); 
     } else { 
      // any other error 
      echo ('An error occured. Exception: ' . $e); 
     } 
    } 
} 


// This function tries to authenticate the user and will return an array with its data 
function authenticate($connection, $username, $password) 
{ 
    // This would be where you call the function that encrypts your password like you did for storage earlier 
    $hashedPassword = md5($password); 

    // assign the collection to a var (or type it directly into the methods parameters) 
    $collectionId = 'users'; 

    //create an example document or an array in order to pass to the following byExample method 
    $exampleDocumentArray = array('username' => $username, 'password' => $hashedPassword); 

    // Get an instance of the collection handler 
    $documentHandler = new CollectionHandler($connection); 

    try { 
     // query the given $collectionId by example using the previously declared $exampleDocument array 
     $cursor = $documentHandler->byExample($collectionId, $exampleDocumentArray); 
     // check if the count of the cursor is one or not. 
     if ($cursor->getCount() == 1) { 
      // do some fancy login stuff here... 

      // get the current document from the cursor 
      $userDocument = $cursor->current(); 

      // set session uid to the document key that was set automatically by ArangoDB, 
      // since we didn't provide our own on registration 
      $_SESSION['uid'] = $userDocument->getKey(); 

      // extract and return the document in form of an array 
      return $userDocument->getAll(); 
     } else { 
      return false; 
     } 
    } catch (Exception $e) { 
     echo ('An error occured. Exception: ' . $e . '<br>'); 
    } 
} 


// register the connection to ArangoDB 
$connection = new Connection(getConnectionOptions()); 


// register a collection handler to work with the 'users' collection 
$collectionHandler = new CollectionHandler($connection); 


// create the 'users' collection... 
// remark those lines if you want to create the collection by hand. 
echo "creating 'users' collection..."; 
try { 
    $collection = new Collection(); 
    $collection->setName('users'); 
    $collectionHandler->create($collection); 
    echo "created.<br>"; 
} catch (Exception $e) { 
    echo ('Could not create collection. Exception: ' . $e . '<br>'); 
} 


// create unique skip list index in 'users' collection on field ''username'... 
// remark those lines if you want to create the index by hand. 
echo "creating unique skip list index in 'users' collection on field ''username'... "; 
try { 
    $collection = new Collection(); 
    $collection->setName('users'); 
    $collectionHandler->index('users', 'skiplist', array('username'), true); 
    echo "created.<br>"; 
} catch (Exception $e) { 
    echo ('Could not create skip list index. Exception: ' . $e . '<br>'); 
} 


// let's assume those variables hold your username/password 
$userNameProvided = 'jane'; 
$passwordProvided = 'mysecretpassword'; 

// here we pass some structured registration data 
$registrationData = array(
    'name'  => 'Jane', 
    'surname' => 'Doe', 
    'addresses' => array(
     'email' => array('[email protected]', '[email protected]'), 
     'home' => array(
      array('street' => 'Brooklyn Ave.', 'number' => 10), 
      array('street' => '54th Street', 'number' => 340, 'is_primary' => true) 
     ) 
    ) 
); 

// First register 
echo "trying to register user for the first time... "; 
$result = register($connection, $userNameProvided, $passwordProvided, $registrationData); 
if ($result) { 
    echo " " . $userNameProvided . " registered<br>"; 
} else { 
    echo "failed<br>"; 
} 


// Trying to register user with same username a second time 
echo "trying to register user with same username a second time... "; 
$result = register($connection, $userNameProvided, $passwordProvided, $registrationData); 
if ($result) { 
    echo "registered<br>"; 
} else { 
    echo "failed<br>"; 
} 


// now authenticate with the correct username/password combination 
echo "trying to authenticate with the correct username/password combination... "; 
if ($userArray = authenticate($connection, $userNameProvided, $passwordProvided)) { 
    echo "login successful. "; 
    echo '<br>'; 
    // do some fancy after-login stuff here... 
    echo "<br>Welcome back " . $userArray['username'] . '!<br>'; 
    if (count($userArray['data']['addresses']['email']) > 0) { 
     echo "Your primary mail address is " . $userArray['data']['addresses']['email'][0] . '<br>'; 
    } 
    foreach ($userArray['data']['addresses']['home'] as $key => $value) { 
     if (array_key_exists('is_primary', $value)) { 
      $homeAddress = $userArray['data']['addresses']['home'][$key]; 
      echo "Your primary home address is " . $homeAddress['number'] . ', ' . $homeAddress['street'] . '<br>'; 
      // if found, break out of the loop. There can be only one... primary address! 
      break; 
     } 
    } 
} else { 
    // re-display login form. +1 the wrong-login counter... 
    echo "wrong username or password<br>"; 
} 
echo '<br>'; 

// now authenticate with the wrong username/password combination 
echo "trying to authenticate with the wrong username/password combination... "; 
if (authenticate($connection, $userNameProvided, 'I am a wrong password')) { 
    // do some fancy after-login stuff here... 
    echo "login successful<br>"; 
} else { 
    // re-display login form. +1 the wrong-login counter... 
    echo "wrong username or password<br>"; 
} 


// truncate the collection... not needed if dropping, but only here to empty the collection of its tests 
// in case you decide to not create and drop the collection through this script, but by hand. 
echo "truncating collection..."; 
try { 
    $collectionHandler->truncate('users'); 
    echo "truncated.<br>"; 
} catch (Exception $e) { 
    die ('Could not truncate collection. Exception: ' . $e . '<br>'); 
} 


// finally drop the collection... 
// remark those lines if you want to drop the collection by hand. 
echo "dropping collection..."; 
try { 
    $collectionHandler->drop('users'); 
    echo "dropped.<br>"; 
} catch (Exception $e) { 
    die ('Could not drop collection. Exception: ' . $e . '<br>'); 
}