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