我有一个注销功能,可以在另一个项目中使用,但由于某种原因,在我当前正在处理的项目中不起作用。看起来只是刷新了页面。我检查了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);
}
}
注销树枝:
<!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。当我转到页面/注销时,它看起来只是刷新页面。我可以看到它进入了注销功能,但用户不会被注销。
来自 Symfony 安全文档:https://symfony.com/doc/3.4/security.html#logging-out
请注意,当使用 http-basic 身份验证防火墙时,没有真正的注销方法:注销的唯一方法是让浏览器停止在每次请求时发送您的名称和密码。清除浏览器缓存或重新启动浏览器通常会有所帮助。一些网络开发人员工具在这里可能也会有帮助。
您使用的是http-basic,因此清除cookie不起作用。因此,如果您想使用该代码,您需要实现不同的身份验证并停止使用 http-basic。
您定义注销路径的访问控制
IS_AUTHENTICATED_ANONYMOUSLY
这是错误的。
请删除
- { path: '^/logout', roles: [IS_AUTHENTICATED_ANONYMOUSLY] }
或
编辑
- { path: '^/logout', roles: [ROLE_BEHEERDER] }
您尚未设置防火墙
main:
anonymous: ~
它应该看起来像 主要的: 匿名:~ 安全竞技场: 模式:^/beheerder
这表明每个人都可以访问“主”防火墙,您应该限制该区域
当你拥有它时,只需将以下行添加到防火墙
logout:
path: /logout
target: /
并定义您已经完成的 /logout 路线。 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
树枝视图
<!-- logout link -->
<a href="{{ path('security_logout') }}">Logout</a>
这确实是一个笑话。如果我删除控制器中的注销方法,我会得到 The controller for URI "/logout" is not callable.
如果我不删除任何内容,它表示控制器必须返回响应。
如果我抛出 new \LogicException('此方法可以为空 - 它将被防火墙上的注销键拦截。');据说我需要删除它。