本文概述
- 实现
- MD5
- SHA1
- SHA2
这些函数在MySQL环境中本机可用, 但是在教义中不可用, 如果尝试在查询中访问它们, 则会出错。为了增加这些功能在理论上的可用性, 我们将添加3个理论扩展(每个功能1个扩展), 然后将其注册到config.yml文件中, 最后我们将展示一些使用示例。
注意:本教程适用于Symfony 2.x和Symfony3.x。
实现首先, 请在捆绑包的根文件夹中找到自己, 并创建一个名为Extensions的文件夹(或根目录/ src)(如果不存在)。然后在名为Doctrine的内部创建一个文件夹, 其中将包含该学说的所有扩展类。
而且, 请不要忘记根据项目内部的位置更改每个类的名称空间。
MD5在先前创建的doctrine文件夹中创建一个名为Md5.php的新类, 并将以下代码保存在其中。
<
?phpnamespace 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 Configurationdoctrine:# Search for the ORM propertyorm:# Those values should be already in your file and this doesn't matterauto_generate_proxy_classes: "%kernel.debug%"naming_strategy: doctrine.orm.naming_strategy.underscoreauto_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 stepMD5: myBundle\Extensions\Doctrine\Md5
你已经准备好出发了!如果你在产品环境中工作, 请清除缓存, 让我们创建一些查询。
MD5用法
MD5函数可供使用, 你可以在查询生成器或纯DQL中使用它。
给定下表Breeds(具有实体Breeds), 找到MD5哈希为” 1″ 的品种。
ID | 名称 | 杂凑 |
---|---|---|
1 | 阿拉斯加雪橇犬 | c4ca4238a0b923820dcc509a6f75849b |
<
?phpclass 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的新类, 并将以下代码保存在其中。
<
?phpnamespace 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 Configurationdoctrine:# Search for the ORM propertyorm:# Those values should be already in your file and this doesn't matterauto_generate_proxy_classes: "%kernel.debug%"naming_strategy: doctrine.orm.naming_strategy.underscoreauto_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 stepSHA1: myBundle\Extensions\Doctrine\Sha1
你已经准备好出发了!如果你在产品环境中工作, 请清除缓存, 让我们创建一些查询。
SHA1用法
SHA1函数可供使用, 你可以在查询生成器或普通DQL中使用它。
给定下表Breeds(具有实体Breeds), 找到SHA1哈希为” 1″ 的品种。
ID | 名称 | 杂凑 |
---|---|---|
1 | 阿拉斯加雪橇犬 | 356a192b7913b04c54574d18c28d46e6395428ab |
<
?phpclass 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的新类, 并将以下代码保存在其中。
<
?phpnamespace 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 Configurationdoctrine:# Search for the ORM propertyorm:# Those values should be already in your file and this doesn't matterauto_generate_proxy_classes: "%kernel.debug%"naming_strategy: doctrine.orm.naming_strategy.underscoreauto_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 stepSHA2: 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 |
<
?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从” 学说扩展名” 存储库中获得的
【如何在Doctrine和Symfony 3中启用加密哈希函数(MD5,SHA1和SHA2)】玩得开心 !
推荐阅读
- 如何在Symfony 3中使用FOSUserBundle创建自定义注销事件(onLogout)监听器
- 如何在Windows中使用Visual Studio编译PHP扩展名(DLL文件)
- 如何解决Composer安装/更新错误(VirtualAlloc()失败:[0x00000008])
- 对于Xamarin Android,我无法处理点击事件的后台通知
- Android Oreo中的通知被延迟
- 有没有办法从桌面/服务器盒发送WhatsApp消息()
- Android Studio(带有ARGB的通知LED上的自定义颜色不起作用)
- Xamarin Android - 自定义通知托盘图标(状态栏)
- 所有移动设备制造商的启动器图标上的Android徽章编号