简体   繁体   中英

Symfony3 Guard and login form

I try to use Guard to make a login form instead of the security.yml way.

Getuser and checkcredential are ok.
onAuthenticationSuccess is ok (if I put a dump($token); die; in onAuthenticationSuccess I can see my user in the token) and redirect to /accueil.
But when it arrived on /accueil it's send back to /login because user authentication is always on anon !

Impossible to find a solution :c/

Firewall in security.yml :

  firewalls:
     dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false

    login_firewall:
        pattern:   ^/login$
        anonymous: true

    main:
        pattern:    ^/
        anonymous: ~
        logout: ~
        switch_user: true
        guard:
             provider: database
             authenticators:
               - ent.login_authenticator

access_control:
  - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
  - { path: ^/admin/, roles: ROLE_ADMIN }
  - { path: ^/, roles: ROLE_USER }

securityController

/**
 * @Route("/login", name="login")
 *
 */
public function loginAction(Request $request)
{

  if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
    return $this->redirectToRoute('accueil');
  }

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

  $exception = $authenticationUtils->getLastAuthenticationError();

  $lastUsername = $authenticationUtils->getLastUsername();

  return $this->render('EntBundle::login.html.twig', [
    'last_username' => $lastUsername,
    'error' => $exception,
  ]);

}

/**
 * @Route("/login_check", name="login_check")
 */
public function loginCheckAction()
{
    // this controller will not be executed,
    // as the route is handled by the Security system
}

loginAuthenticator:

  public function __construct(RouterInterface $router, UserPasswordEncoder   $passwordEncoder, EntityManager $em) {
$this->router = $router;
$this->passwordEncoder = $passwordEncoder;
  $this->em = $em;
 }

public function getCredentials(Request $request)
{
  if ($request->getPathInfo() != '/login_check' ) {
      return null;
  }

  $request->getSession()->set(Security::LAST_USERNAME, $request->request->get('_username'));

  return array(
      'username' => $request->request->get('_username'),
      'password' => $request->request->get('_password'),
  );
}

public function getUser($credentials, UserProviderInterface $userProvider)
{
  try {
      return $this->em->getRepository('EntBundle:User\User')->findOneBy(array('username' => $credentials ));
  }
  catch (UsernameNotFoundException $e) {
      throw new CustomUserMessageAuthenticationException($this->failMessage);
  }
 }

 public function checkCredentials($credentials, UserInterface $user) {

  $plainPassword = $credentials['password'];
  if ($this->passwordEncoder->isPasswordValid($user, $plainPassword)) {
      return true;
  }

  throw new CustomUserMessageAuthenticationException($this->failMessage);
 }

 public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
 {
   //      dump($token); die;
  $url = $this->router->generate('accueil');
  return new RedirectResponse($url);
 }

 public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
 {
  $request->getSession()->set(Security::AUTHENTICATION_ERROR, $exception);

  $url = $this->router->generate('login');
  return new RedirectResponse($url);
 }

 public function start(Request $request, AuthenticationException $authException = null)
 {
  $url = $this->router->generate('login');
  return new RedirectResponse($url);
 }

sorry for the late response, the piece of code would look something like this to set the token in a symfony3 application:

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

and the actual setting of the token part will be like:
$token = new UsernamePasswordToken($user, $user->getPassword(), "firewall goes here for example: main", $user->getRoles());
$this->get("security.token_storage")->setToken($token);

i hope i helped you with this :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM