2017-07-31 170 views
1

我在控制器中保存會話中的值;無法獲取會話變量值symfony

public function setSessionValue($key,$val){ 

    $session = $this->get('session'); 

    $session->set($key,$val); 

    echo "Token is: ".$session->get('token'); 
} 

獲得答案爲;

令牌是:e129cb3b547b6017a9f69fe30a96efed

在另一個請求我從會話使用另一種方法獲取該標記值;

public function getSessionValue($key){ 

    $session = $this->get('session'); 

    echo "Token is: ".$session->get('token'); 
    return $session->get($key); 
} 

現在的反應是:

令牌是:NULL

我security.yml如下文件;

# To get started with security, check out the documentation: 
# https://symfony.com/doc/current/security.html 
security: 

# https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded 
providers: 
    in_memory: 
     memory: ~ 

firewalls: 
    # disables authentication for assets and the profiler, adapt it according to your needs 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 

    main: 
     anonymous: ~ 
     # activate different ways to authenticate 

     # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate 
     #http_basic: ~ 

     # https://symfony.com/doc/current/security/form_login_setup.html 
     #form_login: ~ 

我的全控制器類是:

<?php 

namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Session\Session; 

class BaseController extends Controller{ 

    public $request; 

    public function setSessionValue($key,$val){ 

    $session = $this->get('session'); 

    $session->set($key,$val); 

    echo "Token is: ".$session->get('token'); 
    } 

    public function getSessionValue($key){ 

    $session = $this->get('session'); 

    echo "Token is: ".$session->get('token'); 
    return $session->get($key); 
    } 
} 

然後我做這樣的事情;

<?php 

namespace AppBundle\Controller; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Doctrine\ORM\EntityManagerInterface; 

use AppBundle\Entity\UserData; 
use AppBundle\Bl\LoginOperation; 
use AppBundle\Controller\BaseController; 

class LoginController extends BaseController 
{ 
    /** 
    * @Route("/login", name="loginpage") 
    */ 
public function loginAction($request) 
{ 
     /* more code */ 

     //storing token 
     $this->setSessionValue('token',$obj->token); 
     $this->setSessionValue('uid',$user->getUserId()); 
     $response = json_encode($obj); 

     return new Response($response); 
} 
} 

可能是什麼原因呢?我嘗試了各種方式,但無法檢索第二個請求中的值。

任何想法對我都很有幫助。

+0

什麼是「這個」控制器? –

+0

是的,這是一個控制器。 –

+0

您的會話是如何創建的?它是Symfony Session還是本地PHP會話? 爲什麼你不使用tokenStorage? – Hornth

回答

0

隨着你的信息我看到一個可能的情況:

在symfony中你是一個防火牆(查看應用程序/配置/ security.yml文件)

import:  
    pattern: ^/import$ 
       http_basic: 
        realm: "Secured Auth" 
       provider: myprovider 
main: 
    pattern: ^/ 
    form_login: 
     provider: fos_userbundle 
     csrf_provider: form.csrf_provider 
    logout:  true 
    anonymous: true 

下登錄在這個例子的情況下,如果您在主防火牆下登錄,您將不會自動記錄在導入防火牆下。所以,如果你在主防火牆路徑下的會話設置一個變量,這個變量不會可用的路徑下/進口

您mentionning另一個請求,其中所述會話值(uid和令牌)AREN可用,但我沒有看到你的帖子。

Symfony在您未登錄時創建匿名會話,因此您的值在此會話中。但是,如果您登錄並嘗試訪問不屬於之前匿名會話的會話,但會創建一個新的已創建和已驗證的會話(與我認爲的已知用戶有關)。 我希望我很清楚^^'

+0

我沒有改變security.yml中的任何東西(默認值)。雖然我加了。請檢查。 –

+0

好吧不是一個安全問題,請給我們的端點的完整url和你的控制器的代碼 你有沒有檢查會話是否真的在你的服務器端創建(vm/docker或其他) 你登錄到其中一個端點而不是另一個? – Mcsky

+0

我已經添加了我的課程,您可以請檢查一次嗎?如果有什麼更需要請提及 –