Как инициализировать сессию в контроллерах Symfony и получить к ней доступ в представлениях

Я использую 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

Решение

Отвечая на ваш комментарий, вы можете использовать аутентификацию 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] }
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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector