2013-06-27 85 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

是的,但演示用戶並不是真的入侵登錄系統。 –