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

5fjcxozz  于 2022-11-12  发布在  PHP
关注(0)|答案(2)|浏览(162)

嗨伙计们!
我还没有使用过第二代的Cake,所以我对所有的新东西都有点着迷。我在我的项目中添加了身份验证组件,它工作得很好(登录/退出/传递哈希等),但我似乎找不到如何只使用“Admin”前缀来要求身份验证。
在旧时代是一些“简单”的东西:

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

oaxa6hgo1#

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

确定中间件的范围

有了认证插件,有几种方法可以处理这个问题,最简单的方法可能是在路由级别上应用认证中间件,这样它的范围就可以是你的前缀路由。
您只需删除在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中,前缀on现在是驼峰大小写,而生成的URL是小写的,并以破折号分隔!

另请参阅

*操作手册〉路由〉连接作用域中间件
*操作手册〉路由〉前缀路由
*操作手册〉请求和响应对象〉请求〉请求参数

c7rzv4ha

c7rzv4ha2#

我不知道这是不是一个传统的方法,但它的工作。
在回调方法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的所有方法。

相关问题