仅对管理员前缀 CakePHP 4 进行身份验证

Rik*_*ker 3 authentication cakephp cakephp-4.x

嘿伙计们!

我没有使用过第 2 代的 Cake,所以我对所有新东西都有些厌烦。我将身份验证组件添加到我的项目中,它工作正常(登录/退出/传递哈希等),但我似乎无法找到如何仅使用“管理员”前缀来要求身份验证。

在过去是一些“简单”的东西,比如:

if($this->params[‘prefix’] == ‘admin’){
    $this->Auth->deny(’*’);
}
Run Code Online (Sandbox Code Playgroud)

ndm*_*ndm 5

虽然您可以对身份验证插件的身份验证组件执行类似的操作,但身份验证现在在中间件级别执行,即在调用控制器之前,因此最好避免首先尝试对用户进行身份验证。需要。

范围中间件

使用身份验证插件有几种方法可以解决这个问题,最简单的方法可能是在路由级别应用身份验证中间件,以便将其范围限定为您的前缀路由。

您只需删除在Application::middleware()方法 ( src/Application.php)中添加中间件,而是将其添加到config/routes.php文件或Application::routes()方法中,具体取决于连接前缀路由的位置:

$routes->prefix('Admin', function (RouteBuilder $routes) {
    $routes->registerMiddleware(
        'auth',
        new \Authentication\Middleware\AuthenticationMiddleware($this)
    );
    $routes->applyMiddleware('auth');

    // ...
});
Run Code Online (Sandbox Code Playgroud)

这样,只有在该前缀中连接的路由才会应用身份验证。

有条件地要求经过身份验证的用户

作为第二步,您仍然需要处理可能经过身份验证的用户的检查,以便您的端点实际上受到保护。默认情况下,身份验证组件将自动执行,因此一种方法是仅为Admin前缀加载身份验证组件,例如在您的AppController::initialize()方法中:

if ($this->request->getParam('prefix') === 'Admin') {
    $this->loadComponent('Authentication.Authentication');
}
Run Code Online (Sandbox Code Playgroud)

注意是大写AAdmin!在 CakePHP 4.x 中,前缀 on 现在是驼峰式的,而生成的 URL 是小写的并用破折号分隔!

也可以看看