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

Authentication only for Admin prefix CakePHP 4

大家好!

我还没有使用过第 2 代的 Cake,所以我对所有的新东西都有点困惑。我将身份验证组件添加到我的项目中并且它工作正常(login/out/pass 哈希等)但我似乎无法找到如何只使“管理员”前缀需要身份验证。

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

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

虽然您可以使用身份验证插件的身份验证组件执行类似的操作,但身份验证现在是在中间件级别执行的,即在调用控制器之前执行,因此最好避免在第一次尝试对用户进行身份验证在实际不需要时放置。

范围中间件

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

您只需删除在 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');

    // ...
});

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

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

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

if ($this->request->getParam('prefix') === 'Admin') {
    $this->loadComponent('Authentication.Authentication');
}

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

另见

我不知道这是否是常规方法,但它确实有效。

在回调方法 beforeFilter 中,在我的全局 Appcontroller.php 中,我有以下代码:

public function beforeFilter(\Cake\Event\EventInterface $event)
    {
        if($this->request->getParam('prefix') == 'Api') {
            $this->Authentication->allowUnauthenticated([$this->request->getParam('action')]);
        }

    }
}

它允许访问我的 prefix API.

的所有方法