2017-02-22 7 views
1

Я пытаюсь использовать Guard для создания формы входа в систему вместо метода security.yml.Symfony3 Охранник и форма входа

Getuser и checkcredential в порядке.
onAuthenticationSuccess в порядке (если я положил dump($token); die; в onAuthenticationSuccess, я могу видеть своего пользователя в токене) и перенаправить на/accueil.
Но когда он прибыл/accueil, он отправляется обратно в/login, потому что аутентификация пользователя всегда включена!

Невозможно найти решение: с/

Firewall в 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); 
} 
+0

вы установите маркер пользователя? –

+0

Hi Giovnni благодарит за ответ. Похоже на то, что я пропустил. У вас есть ссылка, которая объясняет, как управлять этим токеном? – lemairep

ответ

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

я надеюсь, что я помог вам с этим :)

Смежные вопросы