2017-08-18 4 views
0

Ich entwickle eine Symfony 3.3 Web App, die ein paar Pakete enthält.Symfony 3.3, Authentifizierung, bcrypt, schlechte Anmeldeinformationen

Ich versuche, einen Weg zu definieren, einen Admin-Benutzer in den Datenbanken wie folgt zu registrieren. Ich bin in der Lage, den Benutzer in der Datenbank zu erstellen, aber danach kann ich mich nicht als dieser Benutzer anmelden: Ich bekomme immer schlechte Anmeldeinformationen. Obwohl mir bewusst ist, dass Dinge besser arrangiert werden können, würde ich gerne verstehen, was ich nicht sehe.

So habe ich ein AdminBundle, darin habe ich eine User-Klasse definiert:

<?php 

namespace myApp\AdminBundle\Entity; 


use FOS\UserBundle\Model\User as BaseUser; 
use Doctrine\ORM\Mapping as ORM; 


/** 
* @ORM\Entity 
* @ORM\Table(name="fos_user") 
*/ 
class User extends BaseUser 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    public function __construct() 
    { 
     parent::__construct(); 

    } 
} 
?> 

und registerAction

/** 
    * register main user/admin 
    * 
    * @Route("/register/{nameuser}", name="Jus_Admin_register") 
    * @Method("GET") 
    * @Template() 
    */ 
    public function registerAction($nameuser) 
     { 

    $user = new User(); 
    $user->setUsername($nameuser); 
    $user->setEmail('[email protected]'); 
    $plainPassword = 'pw'; 
    $encoder = $this->get('security.encoder_factory')->getEncoder($user); 
    $encoded = $encoder->encodePassword($user, $plainPassword); 

    $user->setPassword($encoded); 
    $user->setEnabled(TRUE); 
    $user->setSuperAdmin(TRUE); 
    $userManager = $this->container->get('fos_user.user_manager'); 
    $userManager->updateUser($user); 

    return $this->render('myAppAdminBundle:Admin:login.html.twig');  
} 

Mein security.yml hat:

security: 
    encoders: 
     myApp\AdminBundle\Entity\User: 
      algorithm: bcrypt 
      cost: 10 
      iterations: 1 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

    providers: 
     our_db_provider: 
      entity: 
       class: myApp\AdminBundle\Entity\User 
       property: username 
.... 
    firewalls: 
     admin_area: 
      pattern: ^/myApp/Admin 
      anonymous: ~ 
      form_login: 
       login_path: /myApp/Admin/login 
       check_path: /myApp/Admin/login_check 
      logout: 
       path: /myApp/Admin/logout 
       target: /myApp/Admin/admin 
      http_basic: 
       realm: "Admin reserved" 

      context: primary_auth 

und meine config.yml hat (in der Tat bin ich mir nicht sicher, ob ich überhaupt folgendes brauche):

fos_user: 
    db_driver: orm # other valid values are 'mongodb' and 'couchdb' 
    firewall_name: admin_area 
    user_class: myApp\AdminBundle\Entity\User\ 
    from_email: 
     address: "%mailer_user%" 
     sender_name: "%mailer_user%" 

Wenn ich rufe http://localhost/myApp/Admin/register/admin, wird die folgende Datensatz in die Tabelle fos_user eingefügt:

-- 
-- Dumping data for table `fos_user` 
-- 

INSERT INTO `fos_user` (`id`, `username`, `username_canonical`, `email`, `email_canonical`, `enabled`, `salt`, `password`, `last_login`, `confirmation_token`, `password_requested_at`, `roles`) VALUES 
(1, 'admin', 'admin', '[email protected]', '[email protected]', 1, NULL, '$2y........yq', NULL, NULL, NULL, 'a:1:{i:0;s:16:\"ROLE_SUPER_ADMIN\";}'); 

Ich bin jedoch nicht anmelden kann. Logs sagt:

[2017-08- .. ....] security.INFO: Authentifizierung Anfrage fehlgeschlagen. {"Ausnahme": "[Objekt] (Symfony \ Component \ Sicherheit \ Core \ Exception \ BadCredentialsException (Code: 0): Ungültige Anmeldeinformationen. at /..../vendor/symfony/symfony/src/Symfony/Component/Security /Core/Authentication/Provider/UserAuthenticationProvider.php:91, Symfony \ Component \ Sicherheit \ Core \ Exception \ BadCredentialsException (code: 0): Das angezeigte Passwort ist ungültig. At /..../vendor/symfony/symfony/ src/Symfony/Component/Sicherheit/Kern/Authentifizierung/Provider/DaoAuthenticationProvider.php: 67) "} []

danke, ich schätze Ihre Hilfe

ps. Meine App funktioniert ziemlich gut, wenn ich einen in_memory Sicherheitsanbieter verwenden

+0

Haben Sie versucht, 'sha512' Encoder? –

Antwort

1

Es gibt keine Notwendigkeit, das Passwort manuell zu hash. Es wird vom Benutzermanager beim Update gehashed. Einfaches Passwort einstellen.

$user = new User(); 
... 
$user->setPlainPassword('pw'); 
... 
$userManager->updateUser($user); 

Wenn Sie es Hash wollen manuell dann beheben encodePassword Anruf. Er akzeptiert 2 Argumente: plain Passwort und Salz

$encoded = $encoder->encodePassword('pw', $user->getSalt()); 

https://github.com/symfony/security-core/blob/master/Encoder/PasswordEncoderInterface.php#L29

+0

Ja, ich hätte es sehen sollen. Ich kannte 'setPlainPassword' nicht. Eingeschaltet funktioniert es auch mit 'encodePassword', auch wenn '$ user-> getSalt() = NULL' ist. Perfekt! Danke Cheers m. – mario

Verwandte Themen