我正在为我的cake 3.0应用程序编写一些REST api,我需要将$this->Auth->unauthorizedRedirect
设置为false
,因为手册说这会阻止我的应用程序重定向到登录URL对于未经授权的请求。
http://api.cakephp.org/3.0/class-Cake.Auth.BasicAuthenticate.html
问题是我试图在我的用户控制器中设置它,但它不起作用:
class UsersController extends AppController {
public function initialize() {
parent::initialize();
$this->loadComponent('RequestHandler');
}
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
$this->Auth->allow(['logout']);
// Change the authentication mode when using REST api
if(! $this->RequestHandler->accepts('html')) {
$this->Auth->unauthorizedRedirect = false;
$user = $this->Auth->identify();
if ($user) {
$this->Auth->setUser($user);
}
}
}
此脚本可以正常检测用户是否实际注册,但在我尝试使用错误的身份验证数据时失败,显示登录表单而不是抛出错误。我做错了什么?
答案 0 :(得分:4)
您正在混合身份验证和授权,这是两个不同的事情。登录用户为authentication,测试是否允许登录用户访问特定操作authorization。
因此,未经授权的重定向配置在访问操作时适用于已登录的用户。
您正在寻找的内容,即在未经身份验证的请求上抛出异常,默认情况下由基本身份验证适配器完成,所以我假设您实际上没有使用此适配器!?
因此,如果您使用的是其他适配器,则最好在您尝试识别用户的控制器中实现此行为
$user = $this->Auth->identify();
if (!$user) {
throw new ForbiddenException('Stop! Hammer time!');
} else {
$this->Auth->setUser($user);
}
或者,如果您希望为每个控制器抛出异常,请使用自定义身份验证适配器unauthorized()
方法,该方法在执行可能的重定向之前在未经身份验证的请求上调用。从文档引用:
Cookbook > Authentication > Handling Unauthenticated Requests
当未经身份验证的用户首先尝试访问受保护的页面时,将调用链中最后一个身份验证器的
unauthenticated()
方法。 authenticate对象可以通过返回响应对象来处理发送响应或重定向,以指示不需要进一步的操作。因此,您在身份验证配置中指定身份验证提供程序的顺序很重要。如果authenticator返回null,AuthComponent会将用户重定向到登录操作。 [...]
这是一个扩展表单身份验证处理程序的简单示例:
<强>的src /认证/ MyCustomAuthenticate.php 强>
namespace App\Auth;
use Cake\Auth\FormAuthenticate;
use Cake\Network\Exception\ForbiddenException;
use Cake\Network\Request;
use Cake\Network\Response;
class MyCustomAuthenticate extends FormAuthenticate
{
public function unauthenticated(Request $request, Response $response)
{
if(!$request->accepts('text/html')) {
throw new ForbiddenException('Ah ah ah! You didn\'t say the magic word!');
}
}
}
<强>控制器强>
$this->loadComponent('Auth', [
'authenticate' => [
'MyCustom'
]
]);
另见