【问题标题】:How to initialize session in symfony controllers and access it in views如何在 symfony 控制器中初始化会话并在视图中访问它
【发布时间】:2017-01-19 19:40:17
【问题描述】:

我正在使用 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);
    }
}

现在,简单来说,我需要一种方法来查看是否在 twig 中设置了 user_ID,以便显示我想要的导航链接

【问题讨论】:

  • 您没有使用数据库?你用什么授权他们?
  • 我正在学习 symfony,我还没有退出 DB 部分

标签: php twig symfony


【解决方案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);

在视图中,您可以检查该角色是否已分配给当前用户: (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] } 

【讨论】:

    【解决方案2】:

    如果登录成功,可以在控制器中初始化会话

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

    在使用模板引擎 Twig 的视图中,您可以检查会话值:

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

    【讨论】:

    • 谢谢。我在其他示例中看到我们可以使用 ROLE 访问权限,包括修改 YAML 中的安全性,如果有,您能否添加更多示例?我知道这是我问的答案,但它看起来很老套:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多