CakePHP正在检索用户模型,但默认未返回密码

CakePHP正在检索用户模型,但默认未返回密码,cakephp,Cakephp,我正在编写一个API,它以JSON格式返回符合特定条件的所有用户及其关联模型 我的问题是——在将用户数据返回给获取JSON数据的客户机时,如何使其自动不返回哈希密码字段?这似乎应该是一个标准问题,但如果不使用contain/fields,是否可以使其在执行简单查找时不返回哈希密码 谢谢 您可以使用模型从结果集中删除密码,如下所示: public function afterFind($results = array(), $primary) { foreach($results as $

我正在编写一个API,它以JSON格式返回符合特定条件的所有用户及其关联模型

我的问题是——在将用户数据返回给获取JSON数据的客户机时,如何使其自动不返回哈希密码字段?这似乎应该是一个标准问题,但如果不使用contain/fields,是否可以使其在执行简单查找时不返回哈希密码

谢谢

您可以使用模型从结果集中删除密码,如下所示:

public function afterFind($results = array(), $primary) {
    foreach($results as $key => $value) {
        if(isset($results[$key][$this->modelAlias]['password'])) {
            unset($results[$key][$this->modelAlias]['password']);
        }
    }
}
您可以使用模型从结果集中删除密码,如下所示:

public function afterFind($results = array(), $primary) {
    foreach($results as $key => $value) {
        if(isset($results[$key][$this->modelAlias]['password'])) {
            unset($results[$key][$this->modelAlias]['password']);
        }
    }
}

我倾向于在
beforeFind()
中执行此操作,以便请求包含密码:

public function beforeFind( $query ) {
  # Don't return the password field unless it's specified.
  $query['fields'] = empty( $query['fields'] )
    ? array_diff( array_keys( $this->schema() ), array( 'password' ) )
    : $query['fields'];

  return $query;
}

这样,如果明确指定了密码,我就不会删除它(有时这很有用),但在其他情况下都会删除。此解决方案不一定比标记答案更好或更差,但确实提供了一点灵活性,我发现这很有用。

我倾向于在
beforeFind()中执行此操作,以便可以请求包含密码:

public function beforeFind( $query ) {
  # Don't return the password field unless it's specified.
  $query['fields'] = empty( $query['fields'] )
    ? array_diff( array_keys( $this->schema() ), array( 'password' ) )
    : $query['fields'];

  return $query;
}

这样,如果明确指定了密码,我就不会删除它(有时这很有用),但在其他情况下都会删除。此解决方案不一定比标记的答案更好或更差,但确实提供了一点灵活性,我发现这很有用。

您应该首先使用isset(),以避免在数据中没有密码密钥的情况下引起注意@标记为very true,尽管使用Auth时始终会有一个密码密钥,即使密码为空,您是否不需要在结尾返回
$results
?您应该首先使用isset(),以避免在数据中没有密码密钥时引起注意@标记为very true,尽管使用Auth时始终会有一个密码密钥,即使密码为空,您不需要在结尾返回
$results
?很好的解决方案!!除了性能更好之外,这必须比在
afterFind()
@Rob中循环遍历每条记录性能更好。我发现了一个问题:如果find中加入了关联的模型,这将删除这些模型。有什么解决方法吗?@SDP你能更具体地说明你的意思吗?@RobWilkerson例如,如果Containable用于一次返回多个模型的结果,那么必须列出所有(或没有)字段才能工作。如前所述,我们仅用当前模型模式的字段替换原始(空白)查询。有效地清除关联的模型数据。有道理吗?是的。这绝对是这个例子的一个问题。在您的情况下,您可能必须检查
$query
,并使更新更加外科化。这是一个很好的解决方案!!除了性能更好之外,这必须比在
afterFind()
@Rob中循环遍历每条记录性能更好。我发现了一个问题:如果find中加入了关联的模型,这将删除这些模型。有什么解决方法吗?@SDP你能更具体地说明你的意思吗?@RobWilkerson例如,如果Containable用于一次返回多个模型的结果,那么必须列出所有(或没有)字段才能工作。如前所述,我们仅用当前模型模式的字段替换原始(空白)查询。有效地清除关联的模型数据。有道理吗?是的。这绝对是这个例子的一个问题。在您的案例中,您可能必须检查
$query
,并使更新更具外科手术性。