使用CakePHP 2多年后,我一周前迁移到了CakePHP 3。新的ORM非常棒,但它让我偶然发现了一些基本的东西,这些东西过去常常起作用,在新版本中表现不同。
我应该如何在UsersTable
,find()
和where()
链方法的蛋糕狂欢中query()
构建此查询?
SELECT * FROM `users` WHERE `email` = "ex@ample.com" AND `password`= SHA1(MD5(CONCAT("somePassword", `salt`)))
我会在没有发布实现这一目标的试验的情况下离开,我几乎尝试添加表达式,条件等等。现在我很好奇它应该如何完成。
编辑:这个问题不关于身份验证,更多的是关于如何在CakePHP 3中执行此类查询。
答案 0 :(得分:2)
你应该读到这个:http://book.cakephp.org/3.0/en/controllers/components/authentication.html,然后你可以这样做:
$hasher = $this->passwordHasher();
$hashedPassword = $user->get($fields['password']); //password from the database
if (!$hasher->check('password_given_by_the_user', $hashedPassword)) {
return false;
}
//password is ok if we reach this point
嵌套SQL:http://book.cakephp.org/3.0/en/orm/query-builder.html
$this->Model->find()
->where([$conditions])
->where([$more_conditions]);
答案 1 :(得分:2)
为了完整起见,可以通过简单地嵌套函数表达式来创建嵌套函数。
use Cake\Database\Expression\QueryExpression;
use Cake\Database\Expression\Cake\ORM\Query;
$email = 'foo@bar.baz';
$password = 'foo';
$salt = 'bar';
$Users = TableRegistry::get('Users');
$query = $Users
->find()
->where(function(QueryExpression $exp, Query $query) use ($email, $password, $salt) {
return
$exp->and_([
'email' => $email,
'password' => $query->func()->SHA1([
$query->func()->MD5([
$query->func()->CONCAT([
$password,
'`salt`' => 'literal'
])
])
])
]);
});
或者,可能会被认为更简单
$functionsBuilder = $Users->query()->func();
$query = $Users
->find()
->where([
'email' => $email,
'password' => $functionsBuilder->SHA1([
$functionsBuilder->MD5([
$functionsBuilder->CONCAT([
$password,
'`salt`' => 'literal'
])
])
])
]);
应该注意的是,这只是嵌套的一个例子,在进行身份验证时,使用@AlexStallen提到的身份验证处理程序和正确的密码哈希
另请参阅 Cookbook > Database Access & ORM > Query Builder > Using SQL functions