嗨伙计们!我还没有使用过第二代的Cake,所以我对所有的新东西都有点着迷。我在我的项目中添加了身份验证组件,它工作得很好(登录/退出/传递哈希等),但我似乎找不到如何只使用“Admin”前缀来要求身份验证。在旧时代是一些“简单”的东西:
if($this->params[‘prefix’] == ‘admin’){ $this->Auth->deny(’*’); }
oaxa6hgo1#
虽然您可以使用身份验证插件的身份验证组件执行类似的操作,但现在身份验证是在中间件级别执行的,也就是在调用控制器之前,因此最好避免在实际上不需要的时候尝试首先对用户进行身份验证。
有了认证插件,有几种方法可以处理这个问题,最简单的方法可能是在路由级别上应用认证中间件,这样它的范围就可以是你的前缀路由。您只需删除在Application::middleware()方法(src/Application.php)中添加中间件,而将其添加到config/routes.php文件或Application::routes()方法中,这取决于您连接前缀路由的位置:
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()方法中:
Admin
AppController::initialize()
if ($this->request->getParam('prefix') === 'Admin') { $this->loadComponent('Authentication.Authentication'); }
注意Admin中的大写A!在CakePHP 4.x中,前缀on现在是驼峰大小写,而生成的URL是小写的,并以破折号分隔!
A
*操作手册〉路由〉连接作用域中间件*操作手册〉路由〉前缀路由*操作手册〉请求和响应对象〉请求〉请求参数
c7rzv4ha2#
我不知道这是不是一个传统的方法,但它的工作。在回调方法beforeFilter中,在我的全局Appcontroller.php中,我有以下代码:
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的所有方法。
prefix
2条答案
按热度按时间oaxa6hgo1#
虽然您可以使用身份验证插件的身份验证组件执行类似的操作,但现在身份验证是在中间件级别执行的,也就是在调用控制器之前,因此最好避免在实际上不需要的时候尝试首先对用户进行身份验证。
确定中间件的范围
有了认证插件,有几种方法可以处理这个问题,最简单的方法可能是在路由级别上应用认证中间件,这样它的范围就可以是你的前缀路由。
您只需删除在
Application::middleware()
方法(src/Application.php
)中添加中间件,而将其添加到config/routes.php
文件或Application::routes()
方法中,这取决于您连接前缀路由的位置:这样,只有连接到该前缀的路由才会应用身份验证。
有条件地要求已验证的用户
作为第二步,你仍然需要检查是否有可能通过身份验证的用户,这样你的端点才能得到真正的保护。默认情况下,身份验证组件会自动完成,所以一种方法是只为
Admin
前缀加载身份验证组件,例如在AppController::initialize()
方法中:注意
Admin
中的大写A
!在CakePHP 4.x中,前缀on现在是驼峰大小写,而生成的URL是小写的,并以破折号分隔!另请参阅
*操作手册〉路由〉连接作用域中间件
*操作手册〉路由〉前缀路由
*操作手册〉请求和响应对象〉请求〉请求参数
c7rzv4ha2#
我不知道这是不是一个传统的方法,但它的工作。
在回调方法
beforeFilter
中,在我的全局Appcontroller.php
中,我有以下代码:它允许访问我的
prefix
API的所有方法。