[英]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.