用户身份验证是确保系统安全的第一道防线,能防止未授权的访问。在 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 应用的关键实践之一。