簡體   English   中英

如何在Symfony控制器中初始化會話並在視圖中訪問它

[英]How to initialize session in symfony controllers and access it in views

我正在使用symfony 2.7,並且想根據條件顯示類似登錄/注銷的站點導航欄。

我不是使用數據庫登錄用戶,而是使用控制器中已啟用的會話。

無論如何,我如何綁定此會話並確保用戶看到登錄/注銷頁面?

假設這是一台導航儀

<a href='{{ path('login') }}'> login </a>
<a href='{{ path('logout') }}'> logout </a>

這是我的控制器

public function checkSessionAction(Request $request){
    $session = $request->getSession(); 

    if ( some logic ){
        $session->set('user_ID', $someData);
    }
}

現在,簡單來說,我需要一種方法來查看是否在樹枝中設置了user_ID,以便顯示我想要的導航鏈接

如果登錄成功,則可以在控制器中初始化會話

$this->get('session')->set('IsAuth', true);

在使用模板引擎Twig的視圖中,您可以檢查會話值:

  {% if app.session.get('IsAuth')  %}
         <a href='{{ path('login') }}'> login </a>
   {% else %}
         <a href='{{ path('logout') }}'> logout </a>
  {% endif %} 

回答您的評論,您可以使用Symfony2身份驗證嘗試執行以下操作:

在控制器中使用名稱空間:UsernamePasswordToken:

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;

從數據庫中檢索您的角色並將其存儲在$ aRoleNameToken中

 $aRoleNameToken = array('ROLE_ADMIN','ROLE_USER');

如果身份驗證成功,則設置令牌:

$token = new UsernamePasswordToken($username, null,'secured_area',$aRoleNameToken);

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

在視圖中,您可以檢查該角色是否已分配給當前用戶:( http://symfony.com/doc/2.8/security.html

 {% if is_granted('ROLE_ADMIN') %}
         <a href="...">Delete</a>
 {% endif %}

注銷操作:

 /**
 * @Route("/logout", name="logout")
 */
public function logoutAction() {
   $this->get('security.token_storage')->setToken(null);
   $this->get('request')->getSession()->invalidate();
   return new RedirectResponse($this->generateUrl('login'));
}

在security.yml文件中,您可以對會話進行一些配置。

    access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin, roles: [ROLE_ADMIN] }   
    - { path: ^/home, roles: [ROLE_ADMIN,ROLE_USER] } 
    - { path: ^/login, roles: [ROLE_ADMIN,ROLE_USER]}
    - { path: /, roles: [ROLE_ADMIN,ROLE_USER]}   

如您所見^ / login的值為'IS_AUTHENTICATED_ANONYMOUSLY',這意味着如果您嘗試訪問其他路徑(例如'/ home'或'/ admin'),則登錄頁面是唯一無需身份驗證即可看到的頁面。並且您沒有autenticathion(先前在登錄操作中設置的),您將被重定向到登錄頁面。

   - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }

例如,如果要訪問路徑,則下一句話意味着您必須具有ROLE_ADMIN角色:/ admin

- { path: ^/admin, roles: [ROLE_ADMIN] } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM