2016-03-30 15 views
0

私は現在Symfonyを学んでおり、データベースに保存されているユーザの認証に問題があります。私はhereからチュートリアルに従ってきましたが、私はいつも "無効な資格情報"エラーを受け取ります。これまでのところ私のコードは(申し訳ありませんが、これは "顧客"が望むものです)。symfony 3はデータベースからユーザを認証していません

のsecurity.yml:

security: 

encoders: 
    AppBundle\Entity\Benutzer: 
     algorithm: bcrypt 

providers: 
    mysql_provider: 
     entity: 
      class: AppBundle:Benutzer 
      property: bNID 
firewalls: 
    # disables authentication for assets and the profiler, adapt it according to your needs 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 

    default: 
     anonymous: ~ 
     form_login: 
      login_path: login 
      check_path: login 
      require_previous_session: false 
      default_target_path: /auth/bnme 
     provider: mysql_provider 
     logout: 
      path: /logout 
      target:/

これは私がデータベース

<?php 

namespace AppBundle\Controller; 

use AppBundle\Entity\Benutzer; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Response; 

class UserController extends Controller 
{ 
/** 
* @Route("/user", name="user") 
*/ 

public function createAction(){ 

    //Get Entity Object 
    $user = new Benutzer(); 

    //Encrypt password 

    $plainpw = 'Initial-PW-55218'; 
    $encoder = $this->container->get('security.password_encoder'); 
    $pwd = $encoder->encodePassword($user, $plainpw); 

    //Set Entity fields  
    $user->setANREDE("Herr"); 
    $user->setBNID("[email protected]"); 
    $user->setINIPW($pwd); 
    $user->setBNTYP("SA"); 
    $user->setKOEPID(1); 
    $user->setNACHNAME("KomBau-System"); 
    $user->setVORNAME("UL"); 

    //get Entity Manager 
    $em = $this->getDoctrine()->getManager(); 

    //write Entity in database 
    $em->persist($user); 
    $em->flush(); 

    return new Response('Created user with id: '.$user->getBNID()); 
} 
} 

に私のユーザーをロードする方法であり、これは私のLoginActionのである:

public function loginAction(Request $request){ 

    $authenticationUtils = $this->get('security.authentication_utils'); 

    $error = $authenticationUtils->getLastAuthenticationError(); 

    $system = $this->getDoctrine()->getRepository('AppBundle:System')->find(1); 

    return $this->render('default/sstm.html.twig', array('error' => $error, 'system' => $system)); 
} 

そのユーザーとログインsecurity.ymlの中にハードコードされています。しかし、これは顧客が望むものではありません。誰か助けてくれますか?

これはユーザーのエンティティクラスです。私が原因コードの長さ離れたゲッターとセッターを左:

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Security\Core\User\UserInterface; 

/** 
* 
* @ORM\Table(name="Benutzer_TAB") 
* @ORM\Entity 
* 
* This class represents database table Benutzer_TAB which holds user informations 
*/ 
class Benutzer implements UserInterface, \Serializable 
{ 
/** 
* @var int 
* 
* @ORM\Column(name="KOEPID", type="integer", length=8) 
*/ 

private $kOEPID; 

/** 
* @var string 
* 
* @ORM\Column(name="BNID", type="string", length=255, unique=true) 
* @ORM\id 
* 
* User-ID as email adress 
*/ 
private $bNID; 

/** 
* @var string 
* 
* @ORM\Column(name="BNTYP", type="string", length=2) 
* 
* Usertype (Systemadmin or normal user) 
*/ 
private $bNTYP; 

/** 
* @var string 
* 
* @ORM\Column(name="ANREDE", type="string", length=4) 
*/ 
private $aNREDE; 

/** 
* @var string 
* 
* @ORM\Column(name="VORNAME", type="string", length=255) 
*/ 
private $vORNAME; 

/** 
* @var string 
* 
* @ORM\Column(name="NACHNAME", type="string", length=255) 
*/ 
private $nACHNAME; 

/** 
* @var string 
* 
* @ORM\Column(name="INIPW", type="string", length=255) 
*/ 
private $iNIPW; 

/** 
* @var string 
* 
* @ORM\Column(name="BNPW", type="string", length=255, nullable=true) 
*/ 
private $bNPW; 

/** 
* {@inheritDoc} 
* @see \Symfony\Component\Security\Core\User\UserInterface::getRoles() 
*/ 
public function getRoles() { 
    return array('ROLE_USER'); 
} 

/** 
* {@inheritDoc} 
* @see \Symfony\Component\Security\Core\User\UserInterface::getPassword() 
*/ 
public function getPassword() { 
    if(!$this->getBNPW()){ 
     $this->getINIPW(); 
    } else { 
     $this->getBNPW(); 
    } 
} 

/** 
* {@inheritDoc} 
* @see \Symfony\Component\Security\Core\User\UserInterface::getSalt() 
*/ 
public function getSalt() { 
    return null; 
} 

/** 
* {@inheritDoc} 
* @see \Symfony\Component\Security\Core\User\UserInterface::getUsername() 
*/ 
public function getUsername() { 
    $this->getBNID(); 
} 

/** 
* {@inheritDoc} 
* @see \Symfony\Component\Security\Core\User\UserInterface::eraseCredentials() 
*/ 
public function eraseCredentials() { 
    // TODO: Auto-generated method stub 

} 

/** 
* {@inheritDoc} 
* @see Serializable::serialize() 
*/ 
public function serialize() { 
    return serialize(array(
      $this->kOEPID, 
      $this->bNID, 
      $this->iNIPW, 
    )); 
} 

/** 
* 
* {@inheritDoc} 
* 
* @see Serializable::unserialize() 
*/ 
public function unserialize($serialized) { 
    list(
     $this->kOEPID, 
     $this->bNID, 
     $this->iNIPW,) = unserialize($serialized); 
} 

}

答えて

1

私はそれを最終的に解決しました!そして、私が作った間違いはとても厳しいので、私は心のこもったことで私の評判をすべて失ってしまいます。私は彼らにふさわしくないからです。それがあったので、これはユーザエンティティの私getPasswordに()関数のコードです:

public function getPassword() { 
if(!$this->getBNPW()){ 
    $this->getINIPW(); 
} else { 
    $this->getBNPW(); 
} 
} 

と、これは、それがどのように見えるべきかです:私はそれをすべてを捨てて動作します

public function getPassword() { 
if(!$this->getBNPW()){ 
    return $this->getINIPW(); 
} else { 
    return $this->getBNPW(); 
} 
} 

木など何か.....

0

default_providerするmysql_providerを変更してみてください。 User(Benutzer)エンティティがUserInterfaceを実装していることも確認してください。ユーザーの読み込みにカスタムリポジトリを使用することは害ではありませんが、問題の解決策ではありません。

また、私のコードでは、サービス 'security.encoder_factory'からEncoderFactory :: getEncoder(User)でパスワードをエンコードしています。それはあなたの問題がある場所かもしれません。

+0

ありがとうございましたが、うまくいきませんでした。私はまだ同じ結果を持っています。 – Raistlin

1

エンティティありがとう

あなたのプロバイダのコメントは何故ですか? あなたは次のものを持っている必要があります:

default: 
    anonymous: ~ 
    form_login: 
     provider: mysql_provider 
     login_path: login 
     check_path: login 
     require_previous_session: false 
     default_target_path: /auth/bnme 
+0

はい、少し間違いでした。上記のコメントを参照してください。 – Raistlin

+0

プロバイダはform_loginの下でnoを働かせるべきですか? – lemairep

+0

これは実際にエラーメッセージを変更しました。私は良い兆候としてこれを取る。今度は "システムの問題のために認証要求を処理できませんでした"と表示されます。 – Raistlin

関連する問題