我是Symfony2的新手,我可能有一个关于在数据库中编码用户密码的简单问题。
我想这样编码和存储我的用户密码:
encoded_password = salt . sha1 ( salt . raw_password )
我找到了各种编码器(sha1,sha512,明文),我发现我的数据库raw_password {salt}中包含明文,但是我对Symfony2中的signin / login / getSalt()方法仍然不满意。
如果您可以帮我解决这个问题(请假设我不想使用现有的UserManagement软件包,我想自己创建一个软件包),那就太好了!
谢谢
编辑:
我可以在我的signinAction()中做到这一点:
$salt = substr(md5(time()),0,10); $pwd = $encoder->encodePassword($user->getPassword(), $salt); $user->setPassword($salt.$pwd);
我可以在我的getSalt()中做到这一点:
return substr($this->password,0,10);
但是我目前在我的loginAction()中只有一个:(请参阅此处:http ://symfony.com/doc/current/book/security.html )
// src/Acme/SecurityBundle/Controller/Main; namespace Acme\SecurityBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\Security\Core\SecurityContext; class SecurityController extends Controller { public function loginAction() { $request = $this->getRequest(); $session = $request->getSession(); // get the login error if there is one if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) { $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR); } else { $error = $session->get(SecurityContext::AUTHENTICATION_ERROR); } return $this->render('AcmeSecurityBundle:Security:login.html.twig', array( // last username entered by the user 'last_username' => $session->get(SecurityContext::LAST_USERNAME), 'error' => $error, )); } }
我该如何告诉Symfony2在登录操作期间以所需方式检查密码?(目前正在编码(密码,盐)而不是salt.encode(密码,盐)
简单起见:您必须创建并添加一个新Service,然后将其添加到包中并确定User该类将使用它。首先,您必须实现 自己的密码编码器 :
User
namespace Acme\TestBundle\Service; use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface; class Sha256Salted implements PasswordEncoderInterface { public function encodePassword($raw, $salt) { return hash('sha256', $salt . $raw); // Custom function for password encrypt } public function isPasswordValid($encoded, $raw, $salt) { return $encoded === $this->encodePassword($raw, $salt); } }
然后,您将添加 服务定义 ,并要指定 使用自定义编码器 的类User。在 TestBundle / Resources / config / services.yml中 ,添加自定义编码器:
services: sha256salted_encoder: class: Acme\TestBundle\Service\Sha256Salted
因此,您可以在 app / config / security.yml 中将自定义类指定为默认编码器(用于Acme\TestBundle\Entity\User类):
Acme\TestBundle\Entity\User
encoders: Acme\TestBundle\Entity\User: id: acme.test.sha256salted_encoder
当然,salt在密码加密中起着核心作用。盐是唯一的,并为每个用户存储。该类User可以使用YAML注释自动生成(表应该-当然- 包含用户名,密码,盐等字段),并应实现UserInterface。
UserInterface
最后,当您必须创建新的代码时,可以使用它(控制器代码)Acme\TestBundle\Entity\User:
// Add a new User $user = new User(); $user->setUsername = 'username'; $user->setSalt(uniqid(mt_rand())); // Unique salt for user // Set encrypted password $encoder = $this->container->get('acme.test.sha256salted_encoder') ->getEncoder($user); $password = $encoder->encodePassword('MyPass', $user->getSalt()); $user->setPassword($password);