version 4.1.0

ระบบล็อกอินและการกำหนดสิทธิ์ Access

  อังคารที่ 03 กุมภาพันธ์ พ.ศ. 2558 เวลา 09:20:36 น.      7,392 ครั้ง


ระบบล็อกอินและการกำหนดสิทธิ์ Access

รูปภาพตัวอย่าง

รูปภาพตัวอย่าง

รูปภาพที่ 1 | รูปภาพตัวอย่าง

1. สร้างตารางฐานข้อมูลชื่อว่า "tbl_user" รายละเอียดดังรูปภาพด้านบนนี้

คำสั่งสร้างตาราง "tbl_user"

 CREATE TABLE IF NOT EXISTS `tbl_user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `username` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
  `password` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `group` tinyint(1) NOT NULL,
  `status` char(1) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ;

// add ข้อมูล
INSERT INTO `tbl_user` (`id`, `name`, `username`, `password`, `group`, `status`) VALUES
(1, 'admin', 'admin', 'admin', 1, 'A'),
(2, 'employee', 'employee', 'employee', 2, 'A'),
(3, 'user', 'user', 'user', 3, 'A');

รูปภาพข้อมูลเบื้องต้น

รูปภาพข้อมูลเบื้องต้น

รูปภาพที่ 2 | รูปภาพข้อมูลเบื้องต้น

เพิ่มข้อมูล เพื่อใช้สำหรับการทดสอบ ลงในตาราง "tbl_user" ทั้งหมด 3 รายการ ดังรูปภาพ

รูปภาพตัวอย่าง

รูปภาพตัวอย่าง

รูปภาพที่ 3 | รูปภาพตัวอย่าง

2. สร้างไฟล์ Model ชื่อว่า "User.php" ด้วย Gii System ของตาราง "tbl_user" นี้

สร้างไฟล์ Model สำเร็จ

สร้างไฟล์ Model สำเร็จ

รูปภาพที่ 4 | สร้างไฟล์ Model สำเร็จ



คำสั่งในไฟล์ "UserIdentity.php" มีดังนี้

 class UserIdentity extends CUserIdentity {
    public function authenticate() {
        $username = strtolower($this->username); 
        // $this->username; username คือ ชื่อ Textbox ในฟอร์ม Login
        $user = User::model()->findByAttributes(array('username' => $username));
        // User ชื่อ Model ที่เราสร้างไว้
        if(!isset($user)){ // === NULL
            $this->errorCode = self::ERROR_USERNAME_INVALID;
        }else if(!$user->validatePassword($this->password)){ // !== Password
             $this->errorCode = self::ERROR_PASSWORD_INVALID;
        }else{          
            $this->username = $user->name;
            // $user->name; name ชื่อ Field name ในตาราง tbl_user
            $this->errorCode = self::ERROR_NONE;
        }
        return $this->errorCode == self::ERROR_NONE;
    }
}

1. เข้าไปแก้ไขไฟล์ "UserIdentity.php" ในไดเรคทอรี่ [skeleton]\protected\components\UserIdentity.php

คำสั่งในไฟล์ Users.php

 class User extends CActiveRecord {
    .....
    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }
     
    // เพิ่มฟังก์ชั่น ตรวจสอบข้อมูลรหัสผ่านเหมือนกันหรือไม่
    public function validatePassword($password) 
    {
        return $password === $this->password;
    }
    
}

2. เพิ่มเติมฟังก์ชั่นชื่อว่า "validatePassword()" ลงในไฟล์ Model (User.php) อยู่ในไดเรคทอรี่ [skeleton]\protected\models\User.php

รูปภาพตัวอย่าง

รูปภาพตัวอย่าง

รูปภาพที่ 5 | รูปภาพตัวอย่าง

3. เข้าไปที่ URL http://localhost/yii_workshop/index.php?r=site/login ดังรูปตัวอย่าง

ทดสอบการล็อกอิน ตาม Username, Password ที่เราจำลองไว้ในตาราง "tbl_user" ได้ตามต้องการเช่น admin, admin

รูปภาพตัวอย่าง

รูปภาพตัวอย่าง

รูปภาพที่ 6 | รูปภาพตัวอย่าง



ตัวอย่างคำสั่ง

 class AccessControl extends CApplicationComponent 
{
    public static function check_access($group)
    {
        if(Yii::app()->user->id)
        {
            $return = false;
            $model = User::model()->findByAttributes(array('username' => Yii::app()->user->id));
            if(!empty($model)){
                if(is_integer($group)){
                    if($model->group == $group){
                        $return = true;
                    }
                }
                if(is_array($group)){
                    foreach ($group as $value) {
                        if($model->group == $value){
                            $return = true;
                        }
                    }
                }
            }
            return $return;
        }else{
            return false;
        }
    }
}

สร้างไฟล์ Components ชื่อว่า "AccessControl.php" ในไดเรคทอรี่ [skeleton]\protected\components\AccessControl.php



ตัวอย่างคำสั่ง

 class ExampleController extends Controller 
{
    public function filters()
    {
        return array(
            'accessControl',
        );
    }
    
    public function accessRules()
    {
        return array(
            array(
                'allow', 
                'actions' => array('error', 'login', 'logout'),
                'users' => array('*'),
            ),
            array('allow',
                // กำหนดสิทธิ์เข้าใช้งาน actionIndex
                'actions' => array('index'),
                // ได้เฉพาะ group 2 และ 3 เท่านั่น
                'expression' => 'AccessControl::check_access(array(2, 3))', 
            ),
            array('deny',
                'users' => array('*'),
            ),
        );
    }
    ......
}

1. เพิ่มฟังก์ชั่น filters(), accessRules() ลงในไฟล์ไฟล์ Controller ที่ต้องการกำหนดสิทธิ์

รูปภาพตัวอย่าง

รูปภาพตัวอย่าง

รูปภาพที่ 7 | รูปภาพตัวอย่าง

2. ทดลองเข้าไปที่ URL http://localhost/yii_workshop/index.php?r=example ซึ่ง "ExampleController.php" ตรง "actionIndex()" นี้กำหนดให้เฉพาะ group เท่ากับ 2, 3 แต่สำหรับ admin มีค่า group = 1 จึงไม่สามารถเห็นข้อมูลต่าง ๆ ได้

ตัวอย่างคำสั่ง

 class ExampleController extends Controller 
{
    public function filters()
    {
        return array(
            'accessControl',
        );
    }
    
    public function accessRules()
    {
        return array(
            array(
                'allow', 
                'actions' => array('error', 'login', 'logout'),
                'users' => array('*'),
            ),
            array('allow',
                // กำหนดสิทธิ์เข้าใช้งาน actionIndex
                'actions' => array('index'),
                // ได้เฉพาะ group 1 เท่านั่น
                'expression' => 'AccessControl::check_access(array(1))', 
            ),
            array('deny',
                'users' => array('*'),
            ),
        );
    }
    ......
}

3. แก้ไขค่า accessRules() ลงในไฟล์ไฟล์ "ExampleController.php" เพื่อเปลี่ยนการกำหนดสิทธ์ให้เฉพาะ group = 1

รูปภาพตัวอย่าง

รูปภาพตัวอย่าง

รูปภาพที่ 8 | รูปภาพตัวอย่าง

4. เข้าไปยัง URL http://localhost/yii_workshop/index.php?r=example อีกครั้ง ซึ่งเรากำหนดให้เฉพาะ group เท่ากับ 1 คือ admin เท่านั้นมีสิทธิ์




นักแปล / นักเขียน / เรียบเรียง

author

เอกบิณ ใจแก้วมา (แม็ก)

"โปรแกรมเมอร์ตัวเล็ก ๆ" สะสมประสบการณ์ด้านการพัฒนาซอฟแวร์มามากกว่า 11 ปี
# ติดตามผลงานได้ที่ | พบกับเราที่ Google+ | Facebook






Comment