2012-01-07 29 views
5

Tôi muốn chuyển sang Symfony2, bởi vì tôi hoàn toàn ấn tượng bởi tính hiện đại và lập trình tốt của nó.FOSUserBundle: Mật khẩu tùy chỉnh/Di chuyển từ cấu trúc DB cũ

Bây giờ tôi đang lấy bảng người dùng từ hệ thống cũ của mình, với 10.000 người dùng và tôi không muốn làm họ tức giận bằng cách đặt họ làm mật khẩu mới .... vì vậy tôi muốn họ có thể đăng nhập bằng mật khẩu cũ của họ

đây là pseudo-code về cách bảng người dùng của tôi trông giống như với 3 lĩnh vực chính liên quan đến đăng nhập/đăng ký:

id, int(10) unsigned NOT NULL 
username varchar(40) NOT NULL 
passhash varchar(32) NOT NULL 
secret varchar(20) NOT NULL 

trên đăng ký, dữ liệu được tạo ra theo cách này:

$secret = mksecret(); 
$passhash = md5 ($secret . $password_formfield . $secret); 

trên đăng nhập, các dữ liệu được kiểm tra theo cách sau:

if ($row['passhash'] != md5 ($row['secret'] . $password_formfield . $row['secret'])) 
{ 
//show login error 
} 

Vì vậy, làm thế nào để xử lý nó tốt nhất trong FOSUserBundle, mà không cần phải chỉnh sửa quá nhiều file vậy?

Trả lời

11

Bạn cần phải tạo một bộ mã hóa mật khẩu tùy chỉnh:

<?php 

use Symfony\Component\Security\Core\Encoder\BasePasswordEncoder; 

class MyPasswordEncoder extends BasePasswordEncoder 
{ 
    public function encodePassword($raw, $salt) 
    { 
     return md5($salt.$raw.$salt); 
    } 

    public function isPasswordValid($encoded, $raw, $salt) 
    { 
     return $this->comparePasswords($encoded, $this->encodePassword($raw, $salt)); 
    } 
} 

Và cấu hình nó trong security.yml:

services: 
    my_password_encoder: 
     class: MyPasswordEncoder 

security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: { id: my_password_encoder } 

Chừng nào User::getSalt() lợi nhuận secretUser::getPassword() trả về passhash bạn nên làm tốt.

+0

cảm ơn Kris, rất giải thích. Nhưng tôi nên dán bộ mã hóa mật khẩu ở đâu? – Confidence

+0

Bạn có thể đặt lớp học đó vào một trong các nhóm của bạn. –

+1

aight, sẽ đặt nó dưới Security \ Encoder \ MyPasswordEncoder.php – Confidence

0

Rất dễ thực hiện với FOSUserBundle. Đây là mã cho nó:

$userManager = $this->get('fos_user.user_manager'); 

foreach ($items as $item) { 
    $newItem = $userManager->createUser(); 

    //$newItem->setId($item->getObjId()); 
    // FOSUserBundle required fields 
    $newItem->setUsername($item->getUsername()); 
    $newItem->setEmail($item->getEmail()); 
    $newItem->setPlainPassword($item->getPassword()); // get original password 
    $newItem->setEnabled(true); 

    $userManager->updateUser($newItem, true); 
} 
+0

cảm ơn nhưng tôi không làm việc với mật khẩu thuần túy ở đây. – Confidence

+0

Bạn đặt nó bằng trường 'plainPassword' và nó sẽ được mã hóa bởi FOSUserBundle hoặc bộ mã hóa bảo mật của riêng bạn. –

+0

Điều này sẽ chỉ hoạt động nếu bạn bắt đầu bằng mật khẩu thuần văn bản. Nếu bạn bắt đầu bằng mật khẩu được mã hóa, bạn sẽ có mã hóa kép. – elachance

Các vấn đề liên quan