2013-06-27 48 views
1

我想在Symfony2的手动登录用户。 (我使用fosuserbundle)。 认证将在这样的自定义路由/登录/自动触发Symfony2的安全日志用户手动

下面是匹配/登入,我的控制器代码/自动

public function loginAction(){ 

     $em = $this->container->get('doctrine')->getManager(); 
     $users = $em->getRepository('MybundleMainBundle:User'); 
     $user = $users->findOneByEmail("[email protected]"); 

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

但重定向后,我自动重定向到/登录并没有/家居所以认证失败

这里是我的安全文件的配置:

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] 

感谢ÿ我们的帮助

+0

什么是dev.log说? –

回答

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

嗨,仍然没有工作,我想我有我的security.yml问题,防火墙配置.. – Alexandre

+0

问题是重定向后,我失去了身份验证,但它的工作原理 – Alexandre

+0

好之前,我没有看到失败... –

0

你为什么试图手动登录用户?

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

SEVICE的定义是:

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

也许它是一个演示用户,就像我一样。用一个简单的链接登录用户,就像普通用户一样。 –

+0

我只是认为避免尝试破解登录系统是个好主意。 –

+0

是的,但演示用户并不是真的入侵登录系统。 –