首页 文章

Symfony3 Guard和登录表单

提问于
浏览
1

我尝试使用Guard来创建登录表单而不是security.yml方式 .

Getuser和checkcredential都可以 .
onAuthenticationSuccess没问题(如果我在onAuthenticationSuccess中放了 dump($token); die; ,我可以在令牌中看到我的用户)并重定向到/ accueil .
但当它到达/ accueil时它会发送回/ login,因为用户身份验证总是在anon上!

无法找到解决方案:c /

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);
 }

1 回答

  • 0

    对于迟到的响应感到抱歉,这段代码看起来像这样在symfony3应用程序中设置令牌:

    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);
    

    我希望我帮助你:)

相关问题