У меня есть функция выхода из системы, которая работала в другом проекте, но по какой-то причине не работает в проекте, над которым я сейчас работаю. Похоже, он просто обновляет страницу. Я проверил официальную документацию Symfony https://symfony.com/doc/current/security.html, но безрезультатно. Надеюсь, вы, ребята, можете мне помочь.
Обновлено: Security.yml:
# To get started with security, check out the documentation:
# https://symfony.com/doc/current/security.html
security:
providers:
in_memory:
memory:
users:
beheerder:
password: admin
roles: 'ROLE_BEHEERDER'
access_control:
- { path: '^/beheerder/*', roles: [ROLE_BEHEERDER] }
encoders:
Symfony\Component\Security\Core\User\User: plaintext
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous:
# activate different ways to authenticate
# https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
http_basic: ~
# https://symfony.com/doc/current/security/form_login_setup.html
#form_login: ~
logout:
path: security_logout
target: /
Контроллер:
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\ExpressionLanguage\Expression;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
class DefaultController extends Controller
{
//Functie om naar de homepagina te gaan met een redirect naar de homepagina van de gebruiker.
/**
* @Route("/", name = "homepage")
*/
public function indexAction(Request $request, AuthorizationCheckerInterface $authorizationChecker)
{
if ($authorizationChecker->isGranted(new Expression('"ROLE_BEHEERDER" in roles')))
{
return $this->redirectToRoute('beheerder');
}
else
{
return $this->render('default/index.html.twig');
}
}
/**
* @Route("/beheerder", name = "beheerder")
*/
public function beheerder(Request $request)
{
return new Response($this->renderView('beheerder/index.html.twig'));
}
/**
* @Route("/logout", name = "security_logout")
*/
public function logoutAction(Request $request)
{
return new Response($this->renderView('logout.html.twig'), 401);
}
}
Выйти из Twig:
<!DOCTYPE html>
<html>
<head>
<meta charset = "UTF-8" />
<title>{% block title %}Overzicht{% endblock %}</title>
<link rel = "icon" type = "image/x-icon" href = "{{ asset('favicon.ico') }}" />
</head>
<body>
<p>Redirecting back....</p>
<script>
document.cookie = 'PHPSESSID=; Path=/; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
window.location.href = '{{ url('homepage') }}';
</script>
</body>
</html>
Обновлено: я использую Symfony 3.4. Когда я перехожу на страницу / выход из системы, похоже, что страница просто обновляется. Я вижу, что он переходит в функцию выхода, но пользователь не выходит из системы.
@MohammadTrabelsi Отредактировал вопрос.
logout: определяется дважды. Вероятно, вам следует удалить logout: true.
@ A.L Сделано, но все равно не работает.
Я знаю, что это немного поздно для игры, но я бы не рекомендовал писать параметры и значения на вашем родном языке (голландском).






контроль доступа в вы определяете путь выхода из системы для IS_AUTHENTICATED_ANONYMOUSLY, это неправильно.
Удалите - { path: '^/logout', roles: [IS_AUTHENTICATED_ANONYMOUSLY] }
ИЛИ ЖЕ
редактировать - { path: '^/logout', roles: [ROLE_BEHEERDER] }
Спасибо за отзыв, изменил.
- {путь: '^ / logout', роли: [ROLE_BEHEERDER]} добавьте эту строку в управление доступом, а затем отметьте
Я попробовал, но ничего не вышло. Но это не должно быть проблемой, потому что без него каждый может выйти из системы.
Если вы не возражаете, настройте лучшую функциональность входа в пакет fos-user.
Пока это только больше, но я расширю его в будущем.
Вы используете фос ...?
Вы не установили брандмауэры
main:
anonymous: ~
это должно выглядеть как основной: анонимный: ~ secured_arena: шаблон: ^ / beheerder
имея это говорит, что каждый может получить доступ к "основному" брандмауэру, вы должны ограничить область
когда он у вас есть, просто добавьте в брандмауэр следующие строки
logout:
path: /logout
target: /
и определите маршрут / выход из системы, который вы уже сделали. Symfony автоматически выйдет из системы.
Также необходимо указать аутентификатор и проверку контрольного пути https://symfony.com/doc/current/security/custom_password_authenticator.html
app/config/security.yml
security:
# editor fold [...]
firewalls:
# editor fold [...]
main:
# editor fold [...]
# add logout into the security firewall
logout:
path: security_logout
target: /
# editor fold [...]
access_control:
- { path: '^/beheerder/*', roles: [ROLE_BEHEERDER] }
# Not needed
# - { path: '^/logout', roles: [IS_AUTHENTICATED_ANONYMOUSLY] }
app/config/routing.yml
# editor fold [...]
# add logout path into main routing file
security_logout:
path: /logout
Twig view
<!-- logout link -->
<a href = "{{ path('security_logout') }}">Logout</a>
Спасибо за ответ, но это не сработало. Отредактировал вопрос, может что то не то реализовал?
@ Мистер Дж. Вы удалили / вышли из системы на своем контроллере? Вам это не нужно ... Маршрут выхода находится в файле app / config / routing.yml, больше нечего добавить ... Symfony справится с этим самостоятельно
Из документации по безопасности Symfony: https://symfony.com/doc/3.4/security.html#logging-out
Notice that when using http-basic authenticated firewalls, there is no real way to log out : the only way to log out is to have the browser stop sending your name and password on every request. Clearing your browser cache or restarting your browser usually helps. Some web developer tools might be helpful here too.
Вы используете http-basic, поэтому очистить cookie не получится. Поэтому, если вы хотите использовать этот код, вам нужно реализовать другую аутентификацию и прекратить использование http-basic.
Поподробнее, пожалуйста, версию Symfony и что произошло при выходе из системы.