我正在使用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,以便显示我想要的导航链接
答案 0 :(得分:1)
如果登录成功,您可以在控制器中初始化会话
$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 %}
答案 1 :(得分:1)
回答您的评论,您可以尝试使用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);
在视图中,您可以检查是否已将rol分配给当前用户: (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] }