PEAR::Auth package

PEAR  มีแพ็คเกจที่ชื่อว่า  Auth  ซึ่งช่วยอำนวยความสะดวกในการสร้างระบบตรวจสอบสิทธิ์ผู้ใช้ (authentication) โดยช่วยอำนวยความสะดวกตั้งแต่ การเพิ่มและลบผู้ใช้ การล็อกอิน การนำข้อมูลผู้ใช้มาแสดง การกำหนดระยะเวลาการล็อกอินและ Idle timeout และการตรวจสอบสิทธิ์ผู้ใช้งาน  ทำให้ช่วยลดเวลาในการพัฒนาโปรแกรมลงได้มาก 

สิ่งที่สำคัญคือ Auth รองรับระบบจัดเก็บข้อมูลของผู้ใช้หลากหลายประเภท ได้แก่

  • All databases supported by the PEAR database layer
  • All databases supported by the MDB database layer
  • All databases supported by the MDB2 database layer
  • Plaintext files
  • LDAP servers
  • POP3 servers
  • IMAP servers
  • vpopmail accounts (Using either PECL vpopmail or PEAR Net_Vpopmaild)
  • RADIUS
  • SAMBA password files
  • SOAP (Using either PEAR SOAP package or PHP5 SOAP extension)
  • PEAR website
  • Kerberos V servers
  • SAP servers
การติดตั้ง PEAR Auth package 
การติดตั้ง Auth package สามารถทำได้โดยการใช้คำสั่งต่อไปนี้
# pear install –alldeps auth

 

การติดตั้งแพ็คเกจอื่นๆ ที่เกี่ยวข้อง เช่น MDB2#mysql
การติดตั้ง MBD2 เพื้อใช้งานกับฐานข้อมูล MySQL สามารถทำได้โดยใช้คำสั่งต่อไปนี้
# pear install –alldeps mdb2#mysql

 

การเรียกใช้งาน PEAR Auth package
การเรียกใช้งาน Auth package ให้เรียกใช้งานโดยใช้คำสั่งต่อไปนี้
# require_once (‘Auth.php’);

 

Auth package ได้เตรียมแบบฟอร์มสำหรับการ login ไว้ให้แล้วดังรูปต่อไปนี้

อย่างไรก็ตามเราสามารถสร้างฟอร์มเพื่อให้ผู้ใช้ทำการล็อกอินเองได้ โดยใช้จะต้องสร้างฟังก์ชันขึ้นมา และระบุให้ Auth เรียกใช้งานฟังก์ชันนั้น  ตัวอย่างของฟังก์ชันฟอร์มสำหรับล็อกอินมีลักษณะดังนี้
function loginFunction() {
  echo '<form method="post" action="login.php">';
  echo 'Username <input type="text" name="username" /><br />';
  echo 'Password <input type="password" name="password" /><br />';
  echo '<input type="submit" value="Login" />';
  echo '</form>';

}
หลังจากนั้นจึงกำหนดค่า DSN (Data Source Name) ที่จะใช้งานผ่านทางตัวแปร $options เช่น

$options = array(
  'dsn' => "mysql://user:password@localhost/database",
);

ขั้นตอนต่อไปคือการสร้างอ็อบเจ็คจาก Auth class  โดยให้ระบุ storage containers  ที่จะใช้ เช่น ตัวอย่างนี้ต้องการใช้ MDB2  ระบุ option ผ่านทางตัวแปร $options ซึ่งได้แก่ DSN และ option อื่นๆ(ถ้ามี)  และท้ายที่สุดจะเป็นชื่อของฟังก์ชันล็อกอินที่ได้สร้างไว้ก่อนหน้านี้แล้ว

$auth = new Auth("MDB2", $options, "loginFunction");

เมื่อต้องการให้มีระบบ authentication ทำงาน โดยให้มีการแสดงแบบฟอร์มล็อกอิน  สามารถทำได้โดยใช้คำสั่ง

$auth->start();

โปรแกรมจะเรียกใช้ฟังก์ชัน loginFunction และจะแสดงแบบฟอร์มที่ได้สร้างไว้  ให้ผู้ใช้ทำการล็อกอินเข้าสู่ระบบ

เมื่อต้องการตรวจสอบว่าผู้ใช้ได้ล็อกอินแล้วหรือไม่ ให้ใช้ฟังก์ชัน checkAuth() หรือ getAuth()  ซึ่งทำงานเช่นเดียวกัน

if ($a->checkAuth()) {
  echo "ตรวจสอบแล้วผ่านการ login";
} else {
  echo "ไม่ผ่านการ login";
}

หากผู้ใช้ได้ผ่านการล็อกอินอย่างถูกต้องแล้ว checkAuth() จะคืนค่าเป็น TRUE 

การสร้างฐานข้อมูลเพื่อใช้ร่วมกับ Auth package
มีตัวอย่างดังต่อไปนี้

CREATE TABLE `auth` (                                                  
  `username` varchar(50)  NOT NULL,
  `password` varchar(32) NOT NULL,
  `email` varchar(64) NOT NULL,
  `name` varchar(200),
   PRIMARY KEY  (`username`),
   KEY `password` (`password`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci   

สิ่งที่สำคัญในการสร้างฐานข้อมูลคือ ความยาวของฟิลด์ password นั้นจะต้องมีความยาว 32 ตัวอักษร เนื่องจากรหัสผ่านจะถูกเก็บไว้ในฐานข้อมูลผ่านฟังก์ชัน md5() (เป็น defaut ของ Auth ซึ่งสามารถเปลี่ยนแปลงได้)

นอกจากนี้ชื่อของฟิลด์ที่เก็บข้อมูลขอผู้ใช้นั้น  หากกำหนดเป็นอย่างอื่นที่ไม่ใช่ username และ password จะต้องมีระบุให้ Auth รู้ด้วย โปรดสังเกตตัวอย่าง $option ต่อไปนี้

$options = array(
   'dsn'          => 'mysql://user:password@localhost/database',
   'table' => 'auth',
   'usernamecol'  => 'username',
   'passwordcol'  => 'password',
   'cryptType' => 'sha1',
   'db_fields' => array('email','name'), 
   'db_options'   => array('portability' => MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_FIX_CASE)
);

table เป็นการระบุว่าให้ตรวจสอบข้อมูลผู้ใช้จากฐานข้อมูลใด ซึ่งค่า default นั้นให้ตั้งชื่อตารางว่า auth  ในตัวอย่างข้างต้นสามารถละเว้นได้  แต่หากใช้ชื่อ table ต่างจากนี้ ก็จะต้องระบุไว้ด้วย

usernamecol และ passwordcol ในที่นี้คือ username และ password ซึ่งเป็นค่า default อยู่แล้วจึงไม่จำเป็นต้องใส่ก็ได้ แต่หากเป็นค่าอื่นๆ สามารถระบุด้วยวิธีนี้ได้

cryptType เป็นการกำหนดฟังก์ชันที่จะใช้เข้ารหัส password ซึ่งมีค่า default เป็น md5() แต่ตัวอย่างนี้เปลี่ยนเป็น sha1

db_fields ใช้สำหรับระบุว่าฟิลด์อื่นๆ ในตารางฐานข้อมูลมีอะไรบ้าง  เพื่อให้ Auth ดึงข้อมูลจากฟิลด์เหล่านี้มาใช้งานได้   โดยใช้ฟังก์ชัน getAuthData()  เช่น

echo getAuthData("name");  

จะเป็นคำสั่งที่ให้แสดงข้อมูลในฟิลด์ name ของผู้ใช้

db_options ใช้สำหรับส่งข้อมูลให้กับ storage container เช่น ในตัวอย่างนี้ส่งค่าของ portability ให้กับ MDB2

วิธีการเพิ่มผู้ใช้ในฐานข้อมูล

สามารถทำได้โดยใช้ฟังก์ชัน addUser(); เช่น

$auth->addUser('somchai', 'mypass');

เป็นการเพิ่มผู้ใช้ชื่อ wachira ซึ่งมีรหัสผ่านคือ mypass  หากการเพิ่มผู้ใช้ทำสำเร็จ addUser() จะคืนค่าเป็น TRUE

กรณีที่ต้องเพิ่มข้อมูลของฟิลด์อื่นๆ ด้วยสามารถทำได้ดังตัวอย่างต่อไปนี้

$additional = array('email' => 'myemail@yahoo.com','name' => 'Somchai A.' );
$auth->addUser('somchai', 'mypass', $additional);  

การแสดงรายชื่อผู้ใช้ทั้งหมดในฐานข้อมูล

สามารถทำได้โดยใช้ฟังก์ชัน listUsers(); โดยจะคืนค่ากลับมาเป็นอาเรย์ เช่น

print_r($auth->listUsers());

ตัวอย่างของข้อมูลได้แก่

Array
(
    [0] => Array
        (
            [username] =>somchai
            [password] => d34b6c59ef0497d8ff246abd1049352e
            [email] => myemail@yahoo.com
            [name] => Somchai A.
        )
)

การลบผู้ใช้ออกจากฐานข้อมูล

สามารถทำได้โดยใช้ฟังก์ชัน removeUser(); เช่น  ต้องการลบผู้ใช้ที่มี username ว่า somchai

$auth->removeUser('somchai');

removeUser() จะคืนค่าเป็น TRUE หากสามารถลบผู้ใช้ได้

การกำหนดไม่ให้แสดงแบบฟอร์มล็อกอินหรือไม่

สามารถทำได้โดยเพิ่ม option ตัวที่ 4 ในระหว่างการสร้างออบเจ็ค

$auth = new Auth('DB', $options, 'loginFunction', true);
$auth->start();

จากตัวอย่างข้างต้นจะมีการแสดงแบบฟอร์มล็อกอิน  แต่เมื่อเปลี่ยน true เป็น false จะไม่มีการแสดงแบบฟอร์ม

$auth = new Auth('DB', $options, 'loginFunction', false);
$auth->start();

ซึ่งสามารถนำมาประยุกต์ใช้ได้ดังนี้  โดยจะมีการแสดงแบบฟอร์มล็อกอินเมื่อมีการส่งค่าผ่านตัวแปร login เป็นเงื่อนไขเท่านั้น

if (isset($_GET['login']) && $_GET['login'] == 1) {
   $optional = true;
} else {
   $optional = false;
}
$auth = new Auth('DB', $options, 'loginFunction', $optional);
$auth->start();  

การกำหนดช่วงระยะเวลาในการล็อกอินของผู้ใช้

เราสามารถกำหนดระยะเวลาในการล็อกอินของผู้ใช้ได้ เช่น เมื่อจะต้องทำการล็อกอินใหม่ เมื่อเวลาผ่านไปแล้ว 1 ชั่วโมง  โดยใช้คำสั่ง

$a->setExpire(3600);

เวลามีหน่วยเป็นวินาที

การกำหนด Idle timeout ให้กับผู้ใช้

หลังจากผู้ใช้ล็อกอินแล้ว  หากไม่มีการเรียกใช้ข้อมูล ภายในระยะเวลาที่กำหนดก็จะถูกล็อกเอ้าท์โดยอัตโนมัติ  เช่น  หากผู้ใช้ล็อกอินทิ้งไว้โดยไม่ทำอะไร 30 นาที ก็จะถูกล็อกเอ้าท์  ทำได้โดยใช้คำสั่ง

$a->setIdle(1800);

เวลามีหน่วยเป็นวินาที

การล็อกเอ้าท์ออกจากระบบ

สามารถทำได้โดยใช้ฟังก์ชัน logout() เช่น

$auth->start();
if ($auth->checkAuth()) {
   $auth->logout();
   $auth->start();
}

การกำหนดฟังก์ชันที่จะถูกเรียกใช้งานหลังการล็อกอินและล็อกเอ้าท์

เราสามารถกำหนดให้มีการเรียกใช้งานฟังก์ชันหลังการล็อกอินและล็อกเอ้าท์ โดยใช้ฟังก์ชัน setLoginCallback() และ setLogoutCallback(); ตามลำดับ  ตัวอย่างเช่น

$a->setLoginCallback('myLoginCallback');
$a->setLogoutCallback('myLogoutCallback'); 

 

References:

Leave a Reply

Your email address will not be published. Required fields are marked *