【问题标题】:unauthorizedRedirect set to false, still redirecting未授权重定向设置为 false,仍在重定向
【发布时间】:2015-01-04 15:50:29
【问题描述】:

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

这个脚本可以很好地检测用户是否实际注册,但是当我尝试使用错误的身份验证数据时失败,显示登录表单而不是引发错误。我做错了什么?

【问题讨论】:

  • 刚刚记得基本的身份验证适配器默认会抛出异常,所以我假设您实际上并没有使用它,尽管您已经链接到它的文档?
  • 我做了,但是我用错了(我把 Basic 和 Form 认证放在一起,假设 Cake 会自动切换到正确的…你给我指出了正确的方向有了这个评论,你的回答真的澄清了很多关于身份验证和授权的工作原理。谢谢!p.s.这些答案真的应该放在手册的某个地方,比如常见问题解答部分......

标签: authentication cakephp-3.0


【解决方案1】:

身份验证和授权是两个不同的东西

您混淆了身份验证和授权,这是两件不同的事情。登录用户为authentication,测试是否允许登录用户访问特定操作为authorization

因此,未经授权的重定向配置适用于访问操作时的登录用户。

处理未经身份验证的请求

您要查找的内容,即在未经身份验证 请求上抛出异常,默认情况下是由基本身份验证适配器完成的,所以我假设您实际上没有使用此适配器!? p>

因此,如果您使用不同的适配器,最好在您尝试识别用户的控制器中实现此行为

$user = $this->Auth->identify();
if (!$user) {
    throw new ForbiddenException('Stop! Hammer time!');
} else {
    $this->Auth->setUser($user);
}

或者,如果您希望为每个控制器抛出异常,请在自定义身份验证适配器 unauthorized() 方法中,在执行可能的重定向之前在未经身份验证的请求上调用该方法。引用文档:

Cookbook > Authentication > Handling Unauthenticated Requests

当未经身份验证的用户首先尝试访问受保护的页面时,将调用链中最后一个身份验证器的unauthenticated() 方法。验证对象可以通过返回响应对象来处理发送响应或重定向,以指示不需要进一步的操作。因此,您在身份验证配置中指定身份验证提供程序的顺序很重要。

如果身份验证器返回 null,则 AuthComponent 将用户重定向到登录操作。 [...]

这是一个扩展表单身份验证处理程序的简单示例:

src/Auth/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'
    ]
]);

另见

【讨论】:

    猜你喜欢
    • 2020-03-10
    • 1970-01-01
    • 2021-05-31
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2020-07-24
    相关资源
    最近更新 更多