Yii - 授權



驗證使用者是否有足夠許可權執行某些操作的過程稱為**授權**。Yii 提供了一個 ACF(訪問控制過濾器),這是一種作為**yii\filters\AccessControl**實現的授權方法。修改 SiteController 的 behaviors() 函式 -

public function behaviors() {
   return [
      'access' => [
         'class' => AccessControl::className(),
         'only' => ['about', 'contact'],
         'rules' => [
            [
               'allow' => true,
               'actions' => ['about'],
               'roles' => ['?'],
            ],
            [
               'allow' => true,
               'actions' => ['contact', 'about'],
               'roles' => ['@'],
            ],
         ],
      ],
   ];
}

在上面的程式碼中,ACF 作為行為附加。only 屬性指定僅對 about 和 contact 操作應用 ACF。所有其他操作都不受訪問控制。rules 屬性列出訪問規則。所有訪客(具有“?”角色)都允許訪問**about**操作。所有已認證的使用者(具有“@”角色)都允許訪問 contact 和 about 操作。

如果訪問 URL **https://:8080/index.php?r=site/about**,將會看到頁面,但如果開啟 URL **https://:8080/index.php?r=site/contact**,將會重定向到登入頁面,因為只有已認證的使用者才能訪問**contact**操作。

訪問規則支援許多選項 -

  • **allow** - 定義這是“允許”規則還是“拒絕”規則。

  • **actions** - 定義此規則匹配哪些操作。

  • **controllers** - 定義此規則匹配哪些控制器。

  • **roles** - 定義此規則匹配的使用者角色。識別兩種特殊角色 -

    • **?** - 匹配訪客使用者。

    • **@** - 匹配已認證的使用者。

  • **ips** - 定義此規則匹配的 IP 地址。

  • **verbs** - 定義此規則匹配的請求方法(POST、GET、PUT 等)。

  • **matchCallback** - 定義應呼叫的 PHP 可呼叫函式,以檢查是否應應用此規則。

  • **denyCallback** - 定義當此規則拒絕訪問時應呼叫的 PHP 可呼叫函式。

密碼

**步驟 1** - Yii 提供了以下方便的方法來處理密碼。

public function actionAuth() {

   $password = "asd%#G3";
   
   //generates password hasg
   $hash = Yii::$app->getSecurity()->generatePasswordHash($password);
   var_dump($hash);
   
   //validates password hash
   if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
      echo "correct password";
   } else {
      echo "incorrect password";
   }
   
   //generate a token
   $key = Yii::$app->getSecurity()->generateRandomString();
   var_dump($key);
   
   //encrypt data with a secret key
   $encryptedData = Yii::$app->getSecurity()->encryptByPassword("mydata", $key);
   var_dump($encryptedData);
   
   //decrypt data with a secret key
   $data = Yii::$app->getSecurity()->decryptByPassword($encryptedData, $key);
   var_dump($data);
   
   //hash data with a secret key
   $data = Yii::$app->getSecurity()->hashData("mygenuinedata", $key);
   var_dump($data);
   
   //validate data with a secret key
   $data = Yii::$app->getSecurity()->validateData($data, $key);
   var_dump($data);
}

**步驟 2** - 輸入 URL **https://:8080/index.php?r=site/auth**,將會看到以下內容。

Passwords
廣告