unauthorizedRedirect设置为false,仍然重定向

时间:2015-01-04 15:50:29

标签: authentication cakephp-3.0

我正在为我的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);
        }
    }
}

此脚本可以正常检测用户是否实际注册,但在我尝试使用错误的身份验证数据时失败,显示登录表单而不是抛出错误。我做错了什么?

1 个答案:

答案 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'
    ]
]);

另见