用戶身份驗證是確保系統安全的第一道防線,能防止未授權的訪問。在Yii 中,我們可以創建一個繼承自yii\base\ActionFilter的類作為中間件來攔截未登錄用戶。
以下是一個身份驗證過濾器的示例代碼:
namespace app\filters;
use Yii;
use yii\base\ActionFilter;
class AuthFilter extends ActionFilter
{
public function beforeAction($action)
{
$user = Yii::$app->user;
if ($user->isGuest) {
$user->loginRequired();
return false;
}
return parent::beforeAction($action);
}
}
此過濾器在用戶訪問受保護的操作前進行檢查,若未登錄則會重定向至登錄頁。
接下來我們需要將該過濾器綁定到控制器上:
namespace app\controllers;
use yii\web\Controller;
use app\filters\AuthFilter;
class SiteController extends Controller
{
public function behaviors()
{
return [
'auth' => [
'class' => AuthFilter::class,
'only' => ['admin'],
],
];
}
public function actionAdmin()
{
return 'Admin Area';
}
}
在上述示例中, AuthFilter只應用於admin動作,確保只有經過身份驗證的用戶可以訪問該部分內容。
用戶授權用於判斷已登錄用戶是否具有訪問某一資源或執行某一操作的權限。在Yii 框架中,我們同樣可以藉助過濾器來完成授權邏輯。
下面是一個實現用戶授權的過濾器示例:
namespace app\filters;
use Yii;
use yii\base\ActionFilter;
use yii\web\ForbiddenHttpException;
class AccessControlFilter extends ActionFilter
{
public function beforeAction($action)
{
$user = Yii::$app->user;
if (!$user->can($action->id)) {
throw new ForbiddenHttpException('You are not allowed to perform this action.');
}
return parent::beforeAction($action);
}
}
這個過濾器通過$user->can()方法判斷用戶是否具有執行當前動作的權限,如果沒有權限將拋出403 Forbidden異常。
授權過濾器的應用方式與身份驗證類似:
namespace app\controllers;
use yii\web\Controller;
use app\filters\AccessControlFilter;
class SiteController extends Controller
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControlFilter::class,
'only' => ['admin'],
],
];
}
public function actionAdmin()
{
return 'Admin Area';
}
}
通過這種方式,我們可以靈活控制用戶對特定控制器操作的訪問權限。
本文介紹瞭如何在Yii 框架中使用過濾器機制(即中間件)實現用戶的身份驗證與權限控制。這種方式不僅結構清晰,還能提升整個應用的安全性。通過創建過濾器類並在控制器中配置使用,開發者可以實現高度可控的訪問管理邏輯,是構建安全Web 應用的關鍵實踐之一。