Symfony에 등록한 후 고객을 자동으로 로그인하는 방법

16711 단어 phpsymfony
많은 웹사이트에서 등록 직후에 로그인할 수 있으며 사용자 경험에 아주 좋다고 생각합니다. 그래서 오늘은 Symfony로 하는 방법을 알려드리겠습니다.

기본 구성


  • Symfony와 작곡가가 모두 설치되어 있어야 합니다. SF 라이트 버전을 사용하신다면 제가 사용할 테니 메이커 번들이 설치되어 있는지 확인해주세요.
  • 그렇군요 😊

  • 시작하자



    먼저 사용할 것입니다 : php bin/console make:user
    //I leave User by default
     The name of the security user class (e.g. User) [User]:
     >
    // Yes I want to store it
     Do you want to store user data in the database (via Doctrine)? (yes/no) [yes]:
     >
    //Default value (email) is good
     Enter a property name that will be the unique "display" name for the user (e.g. email, username, uuid) [email]:
     >
    // Yes I want to hash password and I let SF do it for me
     Will this app need to hash/check user passwords? Choose No if passwords are not needed or will be checked/hashed by some other system (e.g. a single sign-on server).
    
     Does this app need to hash/check user passwords? (yes/no) [yes]:
     >
    


    이제 엔티티가 준비되었습니다. Symfony는 방금 User Entity와 UserRepository를 모두 만들었습니다.
    이제 다음을 사용하여 인증을 추가해 보겠습니다.php bin/console make:auth
    // I choose 1 for the complete authenticator
     What style of authentication do you want? [Empty authenticator]:
      [0] Empty authenticator
      [1] Login form authenticator
     > 1
    1
    //I prefer to call it LoginFormAuthenticator
     The class name of the authenticator to create (e.g. AppCustomAuthenticator):
     > LoginFormAuthenticator
    //It's fine for me
     Choose a name for the controller class (e.g. SecurityController) [SecurityController]:
     >
    //Yes I want a logout URL
     Do you want to generate a '/logout' URL? (yes/no) [yes]:
     >
    


    이제 src에 4개의 폴더가 있습니다.
    제어 장치
  • SecurityController.php

  • 실재
  • User.php

  • 저장소
  • UserRepository.php

  • 보안
  • LoginFormAuthenticator.php

  • 마지막으로 확인해보자. 보시다시피 인증에 대한 모든 논리가 있습니다. 원하는 매개변수를 수정할 수 있습니다. 예를 들어 여기에서 이메일이 잘못된 경우 오류 메시지를 변경할 수 있습니다.

     public function getUser($credentials, UserProviderInterface $userProvider)
        {
            $token = new CsrfToken('authenticate', $credentials['csrf_token']);
            if (!$this->csrfTokenManager->isTokenValid($token)) {
                throw new InvalidCsrfTokenException();
            }
    
            $user = $this->entityManager->getRepository(User::class)->findOneBy(['email' => $credentials['email']]);
    
            if (!$user) {
                // fail authentication with a custom error
                throw new 
    CustomUserMessageAuthenticationException('Email could not be found.');
            }
    
            return $user;
        }
    


    사용자가 로그인되면 홈 페이지로 리디렉션하고 싶습니다. 이름이 "app_home"인 HomeController를 이미 생성했다고 가정해 보겠습니다.
    LoginFormAuthenticator.php에는 onAuthenticationSuccess의 기능이 있습니다. 홈페이지로 리디렉션하여 기본값을 변경하겠습니다.

    public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $providerKey)
        {
            if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) {
                return new RedirectResponse($targetPath);
            }
    //I will delete the below line
            throw new \Exception('TODO: provide a valid redirect inside '.__FILE__);
    //And replace it by this one
    return new RedirectResponse($this->urlGenerator->generate('app_home'));
        }
    


    이제 사용자가 홈페이지로 리디렉션됩니다. 끝내자. 새 RegisterController와 양식을 만듭니다(어떻게 하는지 알 것 같아요 😉).
    내 양식을 RegisterType이라고 불렀습니다. 이제 autowiring 덕분에 사용자가 등록 후에 로그인할 수 있도록 하려고 합니다. Request, EntityManager, UserPasswordEncoderInterface, LoginFormAuthentificator 및 GuardAuthenticatorHandler에 대해 autowiring을 사용합니다.

    /**
         * @Route("/register", name="app_register")
         */
        public function registration(Request $request, EntityManagerInterface $manager,UserPasswordEncoderInterface $passwordEncoder, LoginFormAuthentificator $login, GuardAuthenticatorHandler $guard)
        {
    //Basic code for registration
            $user = new User();
            $form = $this->createForm(RegisterType::class, $user);
            $form->handleRequest($request);
    //I always use a unmapped plainPassword for the real password
            if ($form->isSubmitted() && $form->isValid()){
                $user->setPassword($passwordEncoder->encodePassword($user, $form['plainPassword']->getData()));
    
                $manager->persist($user);
                $manager->flush();
    //Just to be UX, I had a flash message
                $this->addFlash('success', 'The registration is successfull');
    //This is how the User could be logged after the registration
    //Guard handle it
    //'main' is your main Firewall. You can check it in config/packages/security.yaml
                return $guard->authenticateUserAndHandleSuccess($user,$request,$login,'main');
            }
    
            return $this->render('security/registration.html.twig', ['form' => $form->createView(),]);
        }
    


    이것이 SF로 하는 방법입니다. 앞으로 등록하는 데 도움이 되기를 바랍니다!

    그게 다야 여러분 😁

    좋은 웹페이지 즐겨찾기