cet article détaille les processus d'enregistrement, de connexion et de connexion de Symfony2. Nous allons s'appuyer sur la base de données et la configuration de sécurité à partir de la partie 1, en nous concentrant sur la création de formulaires, la persistance des objets utilisateur et la gestion sécurisée du mot de passe.
Concepts clés:
User
et persiste cet objet dans la base de données. Un type de formulaire personnalisé (RegistrationType
) gère la cartographie des champs et la gestion des données. L'application hache automatiquement le mot de passe pour la sécurité. /login_check
, nécessite des champs "_Username" et "_Password" - comme mandaté par le système de sécurité de Symfony. Formulaire, base de données et RegistrationType
:
Le processus d'enregistrement utilise un formulaire. Le RegistrationType
(situé dans src/AppBundle/Form/Type/RegistrationType.php
) définit la structure du formulaire:
class RegistrationType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('username', 'text', ['label' => 'User Name']) ->add('password', 'password', ['label' => 'Password']) ->add('confirm', 'password', ['mapped' => false, 'label' => 'Re-type password']) ->add('homepage', 'text', ['label' => 'Homepage']) ->add('email', 'hidden', ['label' => 'email']) ->add('save', 'submit', ['label' => 'Register']); } // ... (getName and setDefaultOptions methods) ... }
'mapped' => false
empêche le champ "Confirmer" d'être enregistré dans la base de données. Le formulaire est créé et rendu à l'aide de brindilles:
{{ form_widget(form.username, {'attr': {'class': 'form-control', 'placeholder':'User Name'}}) }} {{ form_widget(form.password, {'attr': {'class': 'form-control', 'placeholder':'Password'}}) }} {{ form_widget(form.confirm, {'attr': {'class': 'form-control', 'placeholder':'Confirm Password'}}) }} {{ form_widget(form.homepage, {'attr': {'class': 'form-control', 'placeholder':'Homepage'}}) }} {{ form_widget(form.email, {'attr': {'value': email}}) }} <!-- ... rest of the form ... -->
Création d'utilisateurs:
La soumission de formulaire createAction
gère, crée un objet User
, définit les propriétés non fournies par l'utilisateur (date de création, rôles, gravatar), crypte le mot de passe à l'aide de l'encodeur de mot de passe de Symfony et persiste l'utilisateur:
public function createAction(Request $req) { // ... (get entity manager, create form, handle request) ... $user = $form->getData(); $user->setCreated(new \DateTime()); $user->setRoles(['ROLE_USER']); // ... (set gravatar and active status) ... $pwd = $user->getPassword(); $encoder = $this->container->get('security.password_encoder'); $pwd = $encoder->encodePassword($user, $pwd); $user->setPassword($pwd); $em->persist($user); $em->flush(); return $this->redirect($this->generateUrl('login')); }
Connexion et manipulation post-logine:
Le formulaire de connexion (pointant vers /login_check
) est simple:
<!-- ... login form with _username and _password fields ... -->
Les actions post-login nécessitent un gestionnaire de réussite d'authentification personnalisée (défini dans src/AppBundle/Handler/AuthenticationSuccessHandler.php
et enregistré dans services.yml
):
class AuthenticationSuccessHandler extends DefaultAuthenticationSuccessHandler { // ... (constructor with dependency injection) ... public function onAuthenticationSuccess(Request $request, TokenInterface $token) { $user = $token->getUser(); $user->setLogged(new \DateTime()); $em = $this->container->get('doctrine.orm.entity_manager'); $em->persist($user); $em->flush(); return $this->httpUtils->createRedirectResponse($request, $this->determineTargetUrl($request)); } }
Ce gestionnaire met à jour le champ logged
dans l'objet User
après une authentification réussie.
Ce guide complet couvre les fonctionnalités d'enregistrement et de connexion de Symfony2, mettant l'accent sur les meilleures pratiques de sécurité et la personnalisation. Une personnalisation plus approfondie, telle que la validation du formulaire et l'intégration de la connexion sociale, peut être explorée sur la base d'exigences d'application spécifiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!