การสร้าง RULE
1.สร้างโฟลดเดอร์ “components” ใน common/
2.สร้างไฟล์ ContentRule.php ใน common/components/ เพื่อสร้างไฟล์ที่กำหนดกฏ
ตัวอย่าง กฏ คือ สร้างกฏที่ให้ user แต่ละคนสามารถ แก้ไข Content ที่ตนสร้างขึ้นเท่านั้น ไม่สามารถไปแก้ไข content ของคนอื่นได้ แก้ไขไฟล์ดังนี้
ContentRule.php
namespace common\components; use yii\rbac\Rule; use common\models\User; use common\models\Content; use Yii; class ContentRule extends Rule{ public $name = 'isContent'; public function execute($user, $item, $params) { //abstract method implement $id= Yii::$app->request->get('id'); //ตรวจสอบว่า Requestที่ร้องขอมี id ของ content ตรงกับ id ของ content ของ Userที่สร้าง content นั้นขึ้นหรือไม่ //ถ้ามี ให้ User คนดังกล่าว เข้าถึงเนื้อหาดังกล่าวได้ $user = User::findOne($user); $has_content = false; foreach($user->contents as $ucon){ if($ucon->id == $id){ $has_content = true; } } //ตรวจสอบว่าสิทธิ์ของ User คนดังกล่าวเป็น Admin หรือไม่ $role = Yii::$app->authManager->getRolesByUser(Yii::$app->user->getId()); $access =false; foreach($role as $r){ if($r->name == "Admin Position") { $access =true; } } //ถ้าเป็น Admin ให้มีสิทธิ์เข้าถึงได้ทุก Content if($has_content ||$access){ return true; } else{ return false; } } }
โดยไฟล์ผลลัพธ์ของ Code php นั้นจะReturn ค่าเป็น true (เข้าถึงเนื้อหาที่ Request มาได้) หรือ false(ไม่สามารถเข้าถึงเนื้อหาที่ Request มาได้)
3.สร้างเส้นทาง (Routes)
4.สร้างกฏโดยกดปุ่ม Create ในหัวข้อ Rules
5.สร้าง Permission(สิทธิ์) สามารถเพิ่มกฏให้กับ permission ในหัวข้อ Rule Name
6.เพิ่ม Route ให้กับ Permission
7.เพิ่ม Permission ให้กับ Role(หรือ Admin)
หากต้องการมอบหมาย Role ให้กับ User ตอน Sign Up ให้เพิ่ม code ใน controller ในส่วนของ Action Signup() ดังนี้
Action 'Signup'
//เมื่อsign up สำเร็จ $auth = Yii::$app->authManager; $authorRole = $auth->getRole('Author'); $auth->assign($authorRole, $user->id);
หากต้องการตรวจสอบว่า user ที่ล็อคอินเป็น adminหรือไม่ให้ตรวจสอบได้ดังนี้
if(Yii::$app->user->identity->role->id==1){ // role->id=1 : admin }
หรือ
$Role = Yii::$app->authManager->getRolesByUser(Yii::$app->user->getId()); $access =false; foreach($Role as $r){ if($r->name == "Admin Position") { $access =true; } } if($access){ }
หากต้องการตรวจสอบว่า User ที่ล็อคอินคนดังกล่าวสามารถเข้าไปแก้ไขเนื้อหาได้หรือไม่สามารถทำได้ดังนี้
ในส่วนของ Content Controller ในส่วนของ Action “view”
$route = "/manage/content/update"; if(Yii::$app->user->can($route)){ $access = true; }else{ $access=false; }