2015-01-09 3 views
1

내가 비밀번호 암호화 구성 security.yml 사용에 암호화 설정을 사용하여 :Symfony2 보안 : 코드

encoders: 
    Acme\UserBundle\Entity\User: 
     algorithm: bcrypt 
     cost: 10 

가 지금은 엔티티 \ User.php 그렇게 어딘가에 내 사용자 엔티티에 사용자 암호를 업데이트 할을 내가해야

$this->password = password_hash($password, PASSWORD_DEFAULT, ['cost' => 10]); 

하지만 누군가가 예를 들어 암호화 비용 값을 20으로 변경하기로 결정하고 security.yml을 업데이트한다고 상상해 봅시다. 맞춤 암호화 코드를 잊어 버리는 것은 쉽습니다.

내 코드에서 security.yml의 설정을 사용하여 솔루션을보다 일반화되고 변경 사항에 대해 친숙하게 만들 수 있습니까?

답변

1

security.yml에서 물건을 직접 가져 오는 것이 쉽지 않으며 실제로 원하지 않습니다. 보안 시스템에서 사용하는 것과 동일한 암호 인코더 만 사용할 수 있습니다.

$encoderFactory = $this->get('security.encoder_factory'); 

$encoder = $encoderFactory->getEncoder($user); 

$passwordEncrypted = $encoder->encodePassword($passwordPlaintext,$user->getSalt()); 

FOSUserBundle UserManager 클래스를 살펴보십시오. 그것은 몇 가지 유용한 기술을 가지고 있습니다.

0

엔터티 내부에 암호를 수동으로 인코딩해서는 안됩니다. 엔티티를 완전히 독립적 인 상태로두고 인코딩 된 결과를 setPassword()으로 전달하는 것이 더 좋습니다.

그러나 서비스에서와 같이 엔터티 외부에서 수동으로 수행 할 수도 있습니다.이 경우 재현하려는 것이 아니라 컨테이너에서 암호 인코더 팩토리 서비스를 얻는 것이 좋습니다 (또는 더 잘 주입하는 것이 좋습니다). 알고리즘 스스로 :

$encoder = $this->container->get('security.encoder_factory')->getEncoder($user); 
$user->setPassword($encoder->encodePassword('p4ssw0rd', $user->getSalt())); 

또한, Bcrypt를 사용하는 추가 혜택은 동시에 데이터베이스의 모든 암호를 갱신 걱정할 필요없이 언제든지 비용을 변경할 수 있다는 것입니다. 그래도 이전 설정으로 비밀번호를 확인할 수 있으며, 예를 들어 데이터베이스의 비밀번호를 다음 로그인시 더 강력한 보안 설정으로 업데이트 할 수 있습니다.