本文概述
密码散列函数是一种散列函数, 它接受输入(或”消息”)并返回固定大小的字母数字字符串, 该字符串称为散列值(有时称为消息摘要, 数字指纹, 摘要或校验和) 。其中最著名的是MD5, SHA1和SHA2之类的功能。
这些函数在MySQL环境中本机可用, 但是在教义中不可用, 如果尝试在查询中访问它们, 则会出错。为了增加这些功能在理论上的可用性, 我们将添加3个理论扩展(每个功能1个扩展), 然后将其注册到config.yml文件中, 最后我们将展示一些使用示例。
注意:本教程适用于Symfony 2.x和Symfony3.x。
实现
首先, 请在捆绑包的根文件夹中找到自己, 并创建一个名为Extensions的文件夹(或根目录/ src)(如果不存在)。然后在名为Doctrine的内部创建一个文件夹, 其中将包含该学说的所有扩展类。
而且, 请不要忘记根据项目内部的位置更改每个类的名称空间。
MD5
在先前创建的doctrine文件夹中创建一个名为Md5.php的新类, 并将以下代码保存在其中。
<?php
namespace myBundle\Extensions\Doctrine;
use Doctrine\ORM\Query\AST\Functions\FunctionNode, Doctrine\ORM\Query\Lexer;
/**
* @author Andreas Gallien <gallien@seleos.de>
*/
class Md5 extends FunctionNode
{
public $stringPrimary;
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return $sqlWalker->getConnection()->getDatabasePlatform()->getMd5Expression(
$sqlWalker->walkStringPrimary($this->stringPrimary)
);
}
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->stringPrimary = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
上一类将允许你在原则查询中使用MD5函数并防止已知错误:
[语法错误]错误:预期的已知功能, 得到了’MD5′
现在, 该类已存在于我们的项目中, 但尚未注册。为了使用它, 我们需要在我们的项目的config.yml文件中注册该函数, 只需进入主义区域, 并将MD5属性和类路径保存在ORM的dql属性中即可。
# app/config/config.yml
# Doctrine Configuration
doctrine:
# Search for the ORM property
orm:
# Those values should be already in your file and this doesn't matter
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
# We need this the dql property to register the custom doctrine functions :
dql:
string_functions:
# Match agains should have the path to the Md5 class created in the previous step
MD5: myBundle\Extensions\Doctrine\Md5
你已经准备好出发了!如果你在产品环境中工作, 请清除缓存, 让我们创建一些查询。
MD5用法
MD5函数可供使用, 你可以在查询生成器或纯DQL中使用它。
给定下表Breeds(具有实体Breeds), 找到MD5哈希为” 1″的品种。
ID | 名称 | 杂凑 |
---|---|---|
1 | 阿拉斯加雪橇犬 | c4ca4238a0b923820dcc509a6f75849b |
然后, 我们可以使用查询生成器(记住, MD5哈希为1的是c4ca4238a0b923820dcc509a6f75849b):
<?php
class DefaultController extends Controller
{
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository("sandboxBundle:Breeds");
$reg = $repo->createQueryBuilder('a')
->where("a.hash = MD5(:id)")
->setParameter('id', 1 )
->getQuery()
->getResult();
dump($reg);
}
}
$ reg变量应返回阿拉斯加雪橇犬的行。
SHA1
在先前创建的doctrine文件夹中创建一个名为Sha1.php的新类, 并将以下代码保存在其中。
<?php
namespace myBundle\Extensions\Doctrine;
use Doctrine\ORM\Query\AST\Functions\FunctionNode, Doctrine\ORM\Query\Lexer;
/**
* @author Andreas Gallien <gallien@seleos.de>
*/
class Sha1 extends FunctionNode
{
public $stringPrimary;
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return 'SHA1(' .
$sqlWalker->walkStringPrimary($this->stringPrimary) .
')';
}
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->stringPrimary = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
上一类将允许你在原则查询中使用SHA1函数, 并防止已知错误:
[语法错误]错误:预期的已知功能, 得到’SHA1′
现在, 该类已存在于我们的项目中, 但尚未注册。为了使用它, 我们需要在我们的项目的config.yml文件中注册该函数, 只需进入主义区域, 并将SHA1属性和类路径保存在ORM的dql属性中即可。
# app/config/config.yml
# Doctrine Configuration
doctrine:
# Search for the ORM property
orm:
# Those values should be already in your file and this doesn't matter
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
# We need this the dql property to register the custom doctrine functions :
dql:
string_functions:
# Match agains should have the path to the Sha1 class created in the previous step
SHA1: myBundle\Extensions\Doctrine\Sha1
你已经准备好出发了!如果你在产品环境中工作, 请清除缓存, 让我们创建一些查询。
SHA1用法
SHA1函数可供使用, 你可以在查询生成器或普通DQL中使用它。
给定下表Breeds(具有实体Breeds), 找到SHA1哈希为” 1″的品种。
ID | 名称 | 杂凑 |
---|---|---|
1 | 阿拉斯加雪橇犬 | 356a192b7913b04c54574d18c28d46e6395428ab |
然后我们可以使用查询生成器(请记住, SHA1的1哈希为356a192b7913b04c54574d18c28d46e6395428ab):
<?php
class DefaultController extends Controller
{
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository("sandboxBundle:Breeds");
$reg = $repo->createQueryBuilder('a')
->where("a.hash = SHA1(:id)")
->setParameter('id', 1 )
->getQuery()
->getResult();
dump($reg);
}
}
$ reg变量应返回阿拉斯加雪橇犬的行。
SHA2
在先前创建的doctrine文件夹中创建一个名为Sha2.php的新类, 并将以下代码保存在其中。
<?php
namespace myBundle\Extensions\Doctrine;
use Doctrine\ORM\Query\AST\Functions\FunctionNode, Doctrine\ORM\Query\Lexer;
/**
* @author Andreas Gallien <gallien@seleos.de>
*/
class Sha2 extends FunctionNode
{
public $stringPrimary;
public $simpleArithmeticExpression;
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return 'SHA2(' .
$sqlWalker->walkStringPrimary($this->stringPrimary) .
', ' .
$sqlWalker->walkSimpleArithmeticExpression($this->simpleArithmeticExpression) .
')';
}
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->stringPrimary = $parser->StringPrimary();
$parser->match(Lexer::T_COMMA);
$this->simpleArithmeticExpression = $parser->SimpleArithmeticExpression();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
上一类将允许你在原则查询中使用SHA2函数并防止已知错误:
[语法错误]错误:预期的已知功能, 得到’SHA2′
现在, 该类已存在于我们的项目中, 但尚未注册。为了使用它, 我们需要在我们的项目的config.yml文件中注册该函数, 只需进入主义区域, 并将SHA2属性和类路径保存在ORM的dql属性中即可。
# app/config/config.yml
# Doctrine Configuration
doctrine:
# Search for the ORM property
orm:
# Those values should be already in your file and this doesn't matter
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
# We need this the dql property to register the custom doctrine functions :
dql:
string_functions:
# Match agains should have the path to the Sha2 class created in the previous step
SHA2: myBundle\Extensions\Doctrine\Sha2
你已经准备好出发了!如果你在产品环境中工作, 请清除缓存, 让我们创建一些查询。
SHA2使用
SHA2函数可供使用, 你可以在查询生成器或纯DQL中使用它。请记住, SHA2函数将SHA-2系列哈希函数(SHA-224, SHA-256, SHA-384和SHA-512)结合在一起。第一个参数是要散列的明文字符串。第二个参数表示结果的所需位长, 该位的值必须为224、256、384、512或0(等于256)。如果任一参数为NULL或哈希长度不是允许的值之一, 则返回值为NULL。否则, 函数结果是一个包含所需位数的哈希值。
如果我们在原则说明中未提供第二个参数, 则会收到以下错误消息:
[语法错误]错误:预期的Doctrine \ ORM \ Query \ Lexer :: T_COMMA, 得到了’)’
给定下表Breeds(具有实体Breeds), 找到SHA2哈希为” 1″的品种。
ID | 名称 | 杂凑 |
---|---|---|
1 | 阿拉斯加雪橇犬 | 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b |
然后我们可以使用查询生成器(请记住, 256个哈希1中的SHA2是6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b):
<?php
class DefaultController extends Controller
{
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository("sandboxBundle:Breeds");
$reg = $repo->createQueryBuilder('a')
// Read about SHA2 MYSQL : https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_sha2
// The hash is stored with SHA2-256, therefore the second parameter of SHA2 is 256
->where("a.hash = SHA2(:id, 256)")
->setParameter('id', 1 )
->getQuery()
->getResult();
dump($reg);
}
}
$ reg变量应返回阿拉斯加雪橇犬的行。
免责声明:该学说扩展名是由Github中的beberlei从”学说扩展名”存储库中获得的
玩得开心 !
评论前必须登录!
注册