嗨!
我还没有使用过第二代的Cake,所以我对所有的新东西都有些困惑。我在项目中添加了身份验证组件,并且可以正常工作(登录/注销/传递哈希等),但是我似乎找不到如何仅使用“ Admin”前缀进行身份验证的方法。
在过去,“简单”是这样的:
if($this->params[‘prefix’] == ‘admin’){
$this->Auth->deny(’*’);
}
答案 0 :(得分:4)
虽然您可以使用身份验证插件的身份验证组件执行类似的操作,但是现在在中间件级别(即在调用控制器之前)执行身份验证,因此最好避免在出现以下情况时首先尝试对用户进行身份验证其实不是必需的。
有了身份验证插件,有几种方法可以处理此问题,最简单的方法可能是在路由级别上应用身份验证中间件,以便将其范围限定在您的前缀路由中。
您只需删除在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');
}
请注意A
中的大写字母Admin
!在CakePHP 4.x中,现在使用驼峰式大小写,而生成的URL用小写字母和破折号分隔!
答案 1 :(得分:0)
我不知道这是否是常规方法,但是它可以工作。
在回调方法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的所有方法。