2011-03-23 8 views
7

(doctrine) 엔터티의 인증에 대한 모든 게시물에서 모든 코드를 시도했다고 생각합니다. Symfony 2. 제대로 작동하지 않습니다. in_memory 공급자를 사용할 때 모두 정상적으로 작동합니다. PR8을 사용하고 있습니다.symfony 2 인증 (doctrine) 엔터티

security.yml

security: 
    encoders: 
     Partners\FrontendBundle\Entity\User:  plaintext 
     Symfony\Component\Security\Core\User\User: plaintext 
    providers: 
     main: 
      entity: { class: FrontendBundle:User, property: username } 
     #  in_memory: 
     #   users: 
     #    sergi:  { password: boo123, roles: [ 'ROLE_USER' ] } 
    firewalls: 
     main: 
      pattern:   /.* 
      form_login:  true 
      anonymous:  true 
      logout:   true 
    access_control: 
     - { path: /docs.*, role: ROLE_USER } 
     - { path: /control.*, role: ROLE_USER } 
     - { path: /.*, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 

내 사용자 개체

<?php 
    namespace Partners\FrontendBundle\Entity; 
    use Symfony\Component\Security\Core\User\UserInterface; 
    use Partners\FrontendBundle\Repository\UserRepository; 
    /** 
    * @orm:Entity(repositoryClass="Partners\FrontendBundle\Repository 
    \UserRepository") 
    * @orm:Table(name="users") 
    */ 
    class User implements UserInterface 
    { 
     /** 
     * @orm:Id 
     * @orm:Column(type="integer") 
     * @orm:GeneratedValue(strategy="IDENTITY") 
     */ 
     protected $id; 
     /** 
     * @orm:Column(type="string", length="32", unique=true) 
     */ 
     protected $username; 
     /** 
     * @orm:Column(type="string", length="255", unique=true) 
     */ 
     protected $email; 
     /** 
     * @orm:Column(type="string", length="128") 
     */ 
     protected $password; 
     /** 
     * @orm:Column(type="string", length="128") 
     */ 
     protected $organization; 
     /** 
     * @orm:Column(type="string", length="128") 
     */ 
     protected $contact; 
     /** 
     * @orm:Column(type="string", length="16") 
     */ 
     protected $phone; 
     /** 
     * @orm:Column(type="string", length="10") 
     */ 
     protected $cid; 
     /** 
     * @orm:Column(type="smallint") 
     */ 
     protected $status; 
     public function getId() 
     { 
      return $this->id; 
     } 
     public function setId($id) 
     { 
      $this->id = $id; 
     } 
     public function getUsername() 
     { 
      return $this->username; 
     } 
     public function setUsername($username) 
     { 
      $this->username = $username; 
     } 
     public function getPassword() 
     { 
      return $this->password; 
     } 
     public function setPassword($password) 
     { 
      $this->password = $password; 
     } 
     public function setEmail($email) 
     { 
      $this->email = $email; 
     } 
     public function getEmail() 
     { 
      return $this->email; 
     } 
     public function setPhone($phone) 
     { 
      $this->phone = $phone; 
     } 
     public function getPhone() 
     { 
      return $this->phone; 
     } 
     public function setContact($contact) 
     { 
      $this->contact = $contact; 
     } 
     public function getContact() 
     { 
      return $this->contact; 
     } 
     public function setOrganization($org) 
     { 
      $this->organization = $org; 
     } 
     public function getOrganization() 
     { 
      return $this->organization; 
     } 
     public function setCid($cid) 
     { 
      $this->cid = $cid; 
     } 
     public function getCid() 
     { 
      return $this->cid; 
     } 
     public function setStatus($status) 
     { 
      $this->status = $status; 
     } 
     public function getStatus() 
     { 
      return $this->status; 
     } 
     /** 
     * Implementing the UserInterface interface 
     */ 
     public function __toString() 
     { 
      return $this->getUsername(); 
     } 
     public function getRoles() 
     { 
      return array('ROLE_USER'); 
     } 
     public function eraseCredentials() 
     { 
      return false; 
     } 
     public function getSalt() 
     { 
      return $this->getId(); 
     } 
     /** 
     * equals. 
     * 
     * @param UserInterface $account 
     * @return bool 
     */ 
     public function equals(UserInterface $account) 
     { 
      if ($account->getUsername() != $this->getUsername) { 
       return false; 
      } 
      if ($account->getEmail() != $this->getEmail) { 
       return false; 
      } 
      return true; 
     } 
    } 

UserRepository

<?php 
    namespace Partners\FrontendBundle\Repository; 
    use Doctrine\ORM\EntityRepository; 
    use Symfony\Component\Security\Core\User\UserProviderInterface; 
    use Symfony\Component\Security\Core\User\UserInterface; 
    class UserRepository extends EntityRepository implements 
    UserProviderInterface 
    { 
     const CREATED = 0; 
     const ACTIVE = 10; 
     const INACTIVE = 20; 
     /** 
     * loadUserByUsername. 
     * 
     * @param string $username 
     * @return Partners\FrontendBundle\Entity\User 
     */ 
     public function loadUserByUsername($username) 
     { 
      return $this->findOneBy(array('username' => $username)); 
     } 
     function loadUser(UserInterface $user) 
     { 
      return $user; 
     } 
     function loadUserByAccount(AccountInterface $account) 
     { 
      return $this->loadUserByUsername($account->getUsername()); 
     } 
     public function supportsClass($class) 
     { 
      return true; 
     } 
    } 

내가 로그인이 $ 오류에 오류를 형성 채울 때 = $ this-> GET ('request') -> getSession() -> get (SecurityContext :: AUTHENTICATION_ERROR); 다음과 같습니다.

exception 'Symfony\Component\Security\Core\Exception 
\BadCredentialsException' with message 'Bad credentials' in /var/www/ 
inspiring/trunk/Symfony/vendor/symfony/src/Symfony/Component/Security/ 
Core/Authentication/Provider/DaoAuthenticationProvider.php:66 Stack 
trace: #0 /var/www/inspiring/trunk/Symfony/vendor/symfony/src/Symfony/ 
Component/HttpFoundation/SessionStorage/NativeSessionStorage.php(81): 
session_start() #1 /var/www/inspiring/trunk/Symfony/app/cache/dev/ 
classes-53824.php(284): Symfony\Component\HttpFoundation\SessionStorage 
\NativeSessionStorage->start() #2 /var/www/inspiring/trunk/Symfony/app/ 
cache/dev/appDevDebugProjectContainer.php(1151): Symfony\Component 
\HttpFoundation\Session->start() #3 /var/www/inspiring/trunk/Symfony/ 
app/bootstrap.php.cache(109): appDevDebugProjectContainer- 
>getSessionService() #4 /var/www/inspiring/trunk/Symfony/app/cache/dev/ 

classes-53824.php(1553): Symfony\Component\DependencyInjection 
\Container->get('session') #5 /var/www/inspiring/trunk/Symfony/app/ 
cache/dev/classes-53824.php(1544): Symfony\Bundle\FrameworkBundle 
\RequestListener->initializeSession(Object(Symfony\Component 
\HttpFoundation\Request), true) #6 /var/www/inspiring/trunk/Symfony/ 
app/cache/dev/classes-53824.php(1214): Symfony\Bundle\FrameworkBundle 
\RequestListener->onCoreRequest(Object(Symfony\Component\HttpKernel 
\Event\GetResponseEvent)) #7 /var/www/inspiring/trunk/Symfony/vendor/ 
symfony/src/Symfony/Bundle/FrameworkBundle/Debug/ 
TraceableEventDispatcher.php(49): Symfony\Component\EventDispatcher 
\EventDispatcher->triggerListener(Object(Symfony\Bundle\FrameworkBundle 
\RequestListener), 'onCoreRequest', Object(Symfony\Component\HttpKernel 
\Event\GetResponseEvent)) #8 /var/www/inspiring/trunk/Symfony/app/ 
cache/dev/classes-53824.php(1146): Symfony\Bundle\FrameworkBundle\Debug 
\TraceableEventDispatcher->triggerListener(Object(Symfony\Bundle 
\FrameworkBundle\RequestListener), 'onCoreRequest', Object(Symfony 
\Component\HttpKernel\Event\GetResponseEvent)) #9 /var/www/inspiring/ 
trunk/Symfony/app/cache/dev/classes-53824.php(1734): Symfony\Component 
\EventDispatcher\EventDispatcher->dispatch('onCoreRequest', 
Object(Symfony\Component\HttpKernel\Event\GetResponseEvent)) #10 /var/ 
www/inspiring/trunk/Symfony/app/bootstrap.php.cache(411): Symfony 
\Bundle\FrameworkBundle\ContainerAwareEventDispatcher- 
>dispatch('onCoreRequest', Object(Symfony\Component\HttpKernel\Event 

\GetResponseEvent)) #11 /var/www/inspiring/trunk/Symfony/app/ 
bootstrap.php.cache(400): Symfony\Component\HttpKernel\HttpKernel- 
>handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1) #12/

var/www/inspiring/trunk/Symfony/vendor/symfony/src/Symfony/Bundle/ 
FrameworkBundle/HttpKernel.php(35): Symfony\Component\HttpKernel 
\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 
1, true) #13 /var/www/inspiring/trunk/Symfony/app/ 
bootstrap.php.cache(576): Symfony\Bundle\FrameworkBundle\HttpKernel- 
>handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) 

#14 /var/www/inspiring/trunk/Symfony/web/app_dev.php(15): Symfony 
\Component\HttpKernel\Kernel->handle(Object(Symfony\Component 
\HttpFoundation\Request)) #15 {main} 

어디에 문제가 있는지 알 수 없습니다.

+0

가 어떻게 암호가 데이터베이스에 저장됩니다? 일반 텍스트? –

+0

예, 개발하는 동안 일반 텍스트로 저장했습니다. 지금 나는 제작 중이며 그들을 암호화했다. – Sergi

+0

소금은 내 다음 추측이었을 것입니다 .-) –

답변

13

마지막으로 누군가가 나를 도왔습니다. 문제는 암호를 만들 때 소금을 사용하지 않고 User 클래스의 getSalt 함수에서 ID를 반환했기 때문입니다.

암호 (컨트롤러에서) 다음과 같이 생성됩니다

$factory = $this->container->get('security.encoder_factory'); 
$encoder = $factory->getEncoder($user); 
$pwd = $encoder->encodePassword('your_random_password', $user->getSalt()); 
$user->setPassword($pwd); 
관련 문제