【问题标题】:cakephp auth getuser in beforefiltercakephp auth getuser 在 beforefilter
【发布时间】:2014-08-01 09:03:55
【问题描述】:

在具有自定义身份验证实现的 cakephp 应用程序中(请参阅here),我想在 beforefilter 方法中检查用户的身份验证,如果他/她未通过身份验证,我想手动呈现错误页面并退出.我的问题是,似乎只有在对需要身份验证的操作的操作调用之后,身份验证对象才会填充数据。我需要在我的 beforefilter 函数中访问身份验证数据。如何做到这一点?如果我尝试访问它 auth->user() 它返回 NULL,loggedIn() 总是返回 false(因为没有数据,所以有意义)

【问题讨论】:

  • 抱歉,我将 beforerender 与 beforefilter 混淆了 - 现在更正了 - 我的意思是 beforefilter
  • 我也使用自定义身份验证 (ldap),在我的 AppController beforeFilter 方法中,我可以毫无问题地调用 $this->Auth->user() 并获得我的用户数据。我认为问题可能在于您的 TokenAuthenticate 中的身份验证方法从不返回用户数组

标签: php cakephp authentication


【解决方案1】:

我偶然发现了这个问题,建议的解决方案对我不起作用。

在 Cakephp 3 的 beforeFilter 中获取授权信息的正确方法是调用

$this->Auth->config('checkAuthIn', 'Controller.initialize');

在加载 auth 组件之后。这在无状态身份验证场景(例如令牌身份验证)中特别有用。

然后就可以调用 beforeFilter 中获取用户信息了

$user = $this->Auth->user();

请参阅文档http://book.cakephp.org/3.0/en/controllers/components/authentication.html#deciding-when-to-run-authentication

【讨论】:

  • 如何在 cake v2.x 中做到这一点?
  • 在 cake 2.x 中这一行可以成为救命稻草 $this->Auth->startup($this);
【解决方案2】:

无需检查用户是否已通过身份验证并显示错误页面。只需将 unauthenticated() 方法添加到您的自定义身份验证类,就像 BasicAuthenticate 类一样(不设置标题)。使用异常渲染器的错误处理程序将生成适当的错误页面。

【讨论】:

  • 太棒了!如何将其输出为带有 'error' => 'NOT_AUTHORIZED' 的 json 数组?
  • 如果您在 routes.php 中设置“json”扩展解析并在 AppController 中包含 RequestHandler,Cake 将自动返回适当的 json 响应。如果您想自定义响应格式,则必须使用自定义异常渲染器并返回您喜欢的特定异常的响应。
【解决方案3】:

来自manual

class CustomAuthenticate extends BaseAuthenticate {
    public function authenticate(CakeRequest $request, CakeResponse $response) {
        // Return an array of user if they could authenticate the user,
        // return false if not
    }
}

authenticate 方法应该返回一个包含用户数据的数组。从您到另一个问题的链接看来,它没有

【讨论】:

  • 我现在有点困惑。我的身份验证类是无状态的,所以我只需要 auth 类中的 getuser 函数和用户类中的登录/注销函数,还是我错了?我认为仅在调用 auth->login() 时才调用身份验证函数?如果可行,我会尝试一下并将您的答案标记为正确的答案。谢谢!
  • 如果我把 $User = ClassRegistry::init('User');并返回 $User->findById(1)['User'];进入验证方法它仍然不起作用..根本没有调用验证方法..
  • 我坚持这一点。我实现了 suthenticate 方法,它返回用户数组,但是我该如何设置 Auth->user 呢?使用 $this->Auth->setUser($user) 总是给我一个错误,即会话已经开始
【解决方案4】:

在 CakePHP 2.x 中,这可以解决问题

$this->Auth->startup($this);

【讨论】:

    猜你喜欢
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多