【问题标题】:Symfony2 Security log user manuallySymfony2 安全日志用户手动
【发布时间】:2013-06-27 11:00:59
【问题描述】:

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

这是我与 /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]

感谢您的帮助

【问题讨论】:

  • dev.log 是怎么说的?

标签: security symfony logging fosuserbundle


【解决方案1】:

看起来和我的很相似。也许您不应该写入会话。或者令牌需要(散列)密码。试试看,这是一个有效的代码;)

public function demologinAction(Request $request)
{
    $dm = $this->get('doctrine.odm.mongodb.document_manager');
    $repo = $dm->getRepository('AcmeUserBundle:User');
    $user = $repo->findOneByUsername('demo');

    if (!$user) {
        throw $this->createNotFoundException('No demouser found!');
    }

    $token = new UsernamePasswordToken($user, $user->getPassword(), 'main', $user->getRoles());

    $context = $this->get('security.context');
    $context->setToken($token);

    $router = $this->get('router');
    $url = $router->generate('dashboard_show');

    return $this->redirect($url);
}

【讨论】:

  • 嗨,还是不行,我想我的 security.yml 和防火墙配置有问题..
  • 问题是在重定向之后,我失去了身份验证,但在它工作之前
  • 您需要对令牌进行身份验证,而不是简单地设置它。你可以在Symfony2 Documentation on Authentication阅读它。
  • 这个实现是没有密码检查还是我错过了什么?
  • 为什么应该这样? ;) 不,它是用于程序登录,例如模拟帐户或直接在没有密码的特殊注册方法(附属电子邮件,等等)之后。它不适用于用户的常规登录。
【解决方案2】:

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

我可能是错的,但如果是为了让你可以运行一些 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();
}

【讨论】:

  • 也许它是一个演示用户,就像我一样。使用简单链接登录用户,就像普通用户一样。
  • 我只是认为如果可以避免尝试破解登录系统是个好主意。
  • 是的,但演示用户并不是真正的登录系统黑客。
  • 我想这样做是因为我想允许用户使用 Google oauth2 登录。我使用 Google API 来获取用户的电子邮件。如果此电子邮件属于我的用户列表,我想手动记录用户。我在这条路线上这样做:/login/auto。当我手动登录用户时,它适用于这条路线 /login/auto 但是当我在“家”中重定向用户时,他会自动重定向到 /login 我希望你能理解我的问题乔恩,我明天会测试你的解决方案 谢谢再次寻求您的帮助
猜你喜欢
  • 1970-01-01
  • 2014-04-27
  • 2019-04-15
  • 2022-11-23
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多