当前位置: 首页 > 面试题库 >

Symfony2创建自己的编码器以存储密码

霍财
2023-03-14
问题内容

我是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该类将使用它。首先,您必须实现
自己的密码编码器

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类):

 encoders:
   Acme\TestBundle\Entity\User:
     id: acme.test.sha256salted_encoder

当然,salt在密码加密中起着核心作用。盐是唯一的,并为每个用户存储。该类User可以使用YAML注释自动生成(表应该-当然-
包含用户名,密码,盐等字段),并应实现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);


 类似资料:
  • The Python Imaging Library uses a plug-in model which allows you to add your own decoders to the library, without any changes to the library itself. Such plug-ins usually have names like XxxImagePlugi

  • 存储密码 用户名和密码组合必须存储在某处。以下列表提到了一些受欢迎的地方: 文字:你现在应该熟悉这种方法。 SQL数据库:FreeRADIUS包含与SQL数据库交互的模块。 MySQL非常受欢迎,并且广泛用于FreeRADIUS。 目录:Microsof的Actve目录或Novell的电子目录是典型的企业级目录。OpenLDAP是一种流行的开源替代方案。 FreeRADIUS可以使用的用户文件和S

  • 过去一段时间以来, 许多的网站遭遇用户密码数据泄露事件, 这其中包括顶级的互联网企业–Linkedin, 国内诸如CSDN,该事件横扫整个国内互联网,随后又爆出多玩游戏800万用户资料被泄露,另有传言人人网、开心网、天涯社区、世纪佳缘、百合网等社区都有可能成为黑客下一个目标。层出不穷的类似事件给用户的网上生活造成巨大的影响,人人自危,因为人们往往习惯在不同网站使用相同的密码,所以一家“暴库”,全部

  • 问题内容: 可能是一个非常新手的问题,但我一直在阅读,发现在理解密码的创建和存储方面有些困难。从我读过的内容中,md5 / hash密码是将其存储在数据库中的最佳方法。但是,我将如何首先创建这些密码? 因此,说我有一个登录页面,其中包含用户bob和密码bob123-我将如何1.将bobs密码输入数据库(以哈希开头)2.如何获取并确认哈希密码? 谢谢 问题答案: 编辑2017/11/09:请务必查看

  • 我们正在考虑为实体映射和服务创建自己的包,以便在几个单独的应用程序中使用。包应该易于修改、运行、包含和测试。我知道构造包的最佳实践,但我不知道在开发时使用什么策略。 我们应该将bundle创建为一个完整的项目并将整个存储库提交到我们的git服务器,还是只对bundle的root启动源代码管理并只推送其内容更好?我在上的bundle中看到了这种方法,但我不知道以这种方式开发bundle的简单而舒适的

  • 我将遵循“Pro Spring Boot”一书中的“扩展Spring Boot应用程序”一章。在本章中,作者首先解释如何创建自己的spring boot starter-。源代码可以在这里找到。我对maven和spring都是新手。 如果我使用与编写器1.3.3相同的Spring启动版本,它可以正常工作。释放。但是它不适用于当前版本的Spring引导,我想让它适用于当前版本。 基本文件夹结构: 当