Security Symfony2安全日志用户手动

Security Symfony2安全日志用户手动,security,symfony,logging,fosuserbundle,Security,Symfony,Logging,Fosuserbundle,我想在Symfony2中手动登录用户。(我使用fosuserbundle)。 身份验证将在如下/login/auto这样的自定义路由中触发 public function loginAction(){ $em = $this->container->get('doctrine')->getManager(); $users = $em->getRepository('MybundleMainBundle:User'); $

我想在Symfony2中手动登录用户。(我使用fosuserbundle)。 身份验证将在如下/login/auto这样的自定义路由中触发

public function loginAction(){

        $em = $this->container->get('doctrine')->getManager();
        $users = $em->getRepository('MybundleMainBundle:User');
        $user = $users->findOneByEmail("user@user.com");

        $securityContext = $this->get('security.context');
        $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
        $securityContext->setToken($token);
        $this->get('session')->set('_security_'.'main', serialize($token));


        return new RedirectResponse($this->generateUrl('home')); 
}
这是我的控制器代码,与/login/auto匹配

public function loginAction(){

        $em = $this->container->get('doctrine')->getManager();
        $users = $em->getRepository('MybundleMainBundle:User');
        $user = $users->findOneByEmail("user@user.com");

        $securityContext = $this->get('security.context');
        $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
        $securityContext->setToken($token);
        $this->get('session')->set('_security_'.'main', serialize($token));


        return new RedirectResponse($this->generateUrl('home')); 
}
但是在重定向之后,我会自动重定向到/login而不是/home,因此身份验证失败

这是我的安全文件配置:

security:
    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    encoders:
        FOS\UserBundle\Model\UserInterface: sha512

    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
                always_use_default_target_path: true
            logout:       true
            anonymous:    true
            switch_user: true
            remember_me:
                key:    %secret%
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false

    access_control:
        - { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, role: ROLE_USER }

    role_hierarchy:
        ROLE_USER:     ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

谢谢你的帮助

看起来很像我的。也许你不应该在会议上写信。或者令牌需要(哈希)密码。试试看,这里有一个工作代码;)


看起来很像我的。也许你不应该在会议上写信。或者令牌需要(哈希)密码。试试看,这里有一个工作代码;)


为什么要尝试手动登录用户

我可能错了,但是如果原因是您可以运行一些postLogin代码,那么使用内置的登录功能会更容易,但是在登录操作上设置一个侦听器作为服务。然后在那里添加您的登录代码

服务定义为:

user.login:
    class: You\Bundle\EventListener\EventListener
    arguments: [@doctrine.orm.entity_manager, @service_container]
    tags:
          - { name: kernel.event_listener, event: security.interactive_login, method: onLogin }
您的事件侦听器可能是:

public function onLogin(InteractiveLoginEvent $event)
{
    $user = $event->getAuthenticationToken()->getUser();
    $user->setLastLoggedInAt(new \DateTime());
    $user->setLoginCount($user->getLoginCount() + 1);

    $this->manager->flush();
}

为什么要尝试手动登录用户

我可能错了,但是如果原因是您可以运行一些postLogin代码,那么使用内置的登录功能会更容易,但是在登录操作上设置一个侦听器作为服务。然后在那里添加您的登录代码

服务定义为:

user.login:
    class: You\Bundle\EventListener\EventListener
    arguments: [@doctrine.orm.entity_manager, @service_container]
    tags:
          - { name: kernel.event_listener, event: security.interactive_login, method: onLogin }
您的事件侦听器可能是:

public function onLogin(InteractiveLoginEvent $event)
{
    $user = $event->getAuthenticationToken()->getUser();
    $user->setLastLoggedInAt(new \DateTime());
    $user->setLoginCount($user->getLoginCount() + 1);

    $this->manager->flush();
}


您好,仍然不工作,我想我的security.yml和防火墙配置有问题。问题是在重定向之后,我失去了身份验证,但在它工作之前,您需要对令牌进行身份验证,而不是简单地设置它。您可以在中阅读。此实现没有密码检查,还是我遗漏了什么?为什么应该?;)不,这是程序登录,如演示帐户或直接在一个特殊的注册方法(会员电子邮件,无论什么)没有密码。它不是用于用户的常规登录。您好,仍然不工作,我想我的security.yml和防火墙配置有问题。问题是在重定向后,我失去了身份验证,但在它工作之前,您需要对令牌进行身份验证,而不是简单地设置它。您可以在中阅读。此实现没有密码检查,还是我遗漏了什么?为什么应该?;)不,这是程序登录,如演示帐户或直接在一个特殊的注册方法(会员电子邮件,无论什么)没有密码。这不是一个用户的常规登录。也许它是一个演示用户,就像我一样。像普通用户一样,使用简单的链接登录用户。我只是认为如果可以避免的话,避免尝试入侵登录系统是个好主意。是的,但是演示用户并不是真正的入侵登录系统。我想这样做是因为我想让用户使用Google oauth2登录。我使用谷歌API获取用户的电子邮件。如果此电子邮件属于我的用户列表,我想手动记录该用户。我这样做是通过这个路径的:/login/auto。当我手动登录用户时,它在这个路径上工作/login/auto但是当我在“home”中重定向用户时,他被重定向到/login自动,我希望你能理解我的问题Jon,我明天会测试你的解决方案再次感谢你的帮助也许这是一个演示用户,就像我一样。像普通用户一样,使用简单的链接登录用户。我只是认为如果可以避免的话,避免尝试入侵登录系统是个好主意。是的,但是演示用户并不是真正的入侵登录系统。我想这样做是因为我想让用户使用Google oauth2登录。我使用谷歌API获取用户的电子邮件。如果此电子邮件属于我的用户列表,我想手动记录该用户。我这样做是通过这个路径的:/login/auto。当我手动登录用户时,它在这个路径上工作/login/auto但是当我在“home”中重定向用户时,他被重定向到/login自动,我希望你能理解我的问题Jon,我明天会测试你的解决方案再次感谢你的帮助dev.log说了什么?dev.log说了什么?