如何自定义访问拒绝响应

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.2,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

如何自定义访问拒绝响应

在Sy欧宝娱乐app下载地址mfony中,你可以抛出一个AccessDeniedException禁止对用户的访问。欧宝娱乐app下载地址Symfony将处理此异常并根据身份验证状态生成响应:

  • 如果用户没有通过认证(或匿名身份验证),身份验证入口点用于生成响应(通常是重定向到登录页面或401年未经授权反应);
  • 用户通过认证,但不具备权限,一个403年被禁止的生成响应。

自定义未经授权的响应

您需要创建一个实现AuthenticationEntryPointInterface.该接口有一个方法(start ()),当一个未经身份验证的用户试图访问一个受保护的资源时调用:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/ / src /安全/ AuthenticationEntryPoint.php名称空间应用程序安全使用欧宝娱乐app下载地址组件HttpFoundationRedirectResponse使用欧宝娱乐app下载地址组件HttpFoundation请求使用欧宝娱乐app下载地址组件HttpFoundation会话SessionInterface使用欧宝娱乐app下载地址组件路由发电机UrlGeneratorInterface使用欧宝娱乐app下载地址组件安全核心异常AuthenticationException使用欧宝娱乐app下载地址组件安全Http入口点AuthenticationEntryPointInterfaceAuthenticationEntryPoint实现了AuthenticationEntryPointInterface私人urlGenerator私人会话公共函数__construct(UrlGeneratorInterfaceurlGenerator, SessionInterface会话->urlGenerator =urlGenerator->会话=会话;}公共函数开始(请求请求, AuthenticationExceptionauthException= null)RedirectResponse//添加自定义flash消息并重定向到登录页面->会话->getFlashBag ()->add (“注意”“你必须登录才能进入这个页面。”);返回RedirectResponse (->urlGenerator->生成(“security_login”));}}

如果你用的是默认的服务。yaml的配置.否则,您必须在容器中注册此服务。

现在,将这个服务ID配置为防火墙的入口点:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
#配置/包/ security.yaml防火墙:#……主要:#……entry_point:App \安全\ AuthenticationEntryPoint

自定义禁止响应

创建一个实现的类AccessDeniedHandlerInterface.该接口定义了一个名为处理()当当前用户访问被拒绝时,你可以实现任何应该执行的逻辑(例如发送邮件,记录消息,或通常返回一个自定义响应):

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /安全/ AccessDeniedHandler.php名称空间应用程序安全使用欧宝娱乐app下载地址组件HttpFoundation请求使用欧宝娱乐app下载地址组件HttpFoundation响应使用欧宝娱乐app下载地址组件安全核心异常AccessDeniedException使用欧宝娱乐app下载地址组件安全Http授权AccessDeniedHandlerInterfaceAccessDeniedHandler实现了AccessDeniedHandlerInterface公共函数处理(请求请求, AccessDeniedExceptionaccessDeniedException:哦?响应/ /……返回响应(内容403);}}

如果你在用默认的服务。yaml的配置,你完蛋了!欧宝娱乐app下载地址Symfony将自动了解您的新服务。然后你可以在防火墙下配置它:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
#配置/包/ security.yaml防火墙:#……主要:#……access_denied_handler:App \安全\ AccessDeniedHandler

自定义所有拒绝访问的响应

在某些情况下,你可能想要自定义两个响应或为每个响应执行特定的操作(例如日志记录)AccessDeniedException.在这种情况下,配置a内核。异常监听器

12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
/ / src / EventListener / AccessDeniedListener.php名称空间应用程序EventListener使用欧宝娱乐app下载地址组件EventDispatcherEventSubscriberInterface使用欧宝娱乐app下载地址组件HttpFoundation响应使用欧宝娱乐app下载地址组件HttpKernel事件ExceptionEvent使用欧宝娱乐app下载地址组件HttpKernelKernelEvents使用欧宝娱乐app下载地址组件安全核心异常AccessDeniedExceptionAccessDeniedListener实现了EventSubscriberInterface公共静态函数getSubscribedEvents()数组返回//优先级必须大于安全HTTP// ExceptionListener,以确保它在之前被调用//默认的异常监听器KernelEvents::异常= > [“onKernelException”2]];}公共函数onKernelException(ExceptionEvent事件无效异常事件->getThrowable ();如果(!异常运算符AccessDeniedException) {返回;}/ /……执行一些操作(例如记录日志)//可选设置自定义响应事件->setResponse (响应(403));//或停止传播(阻止下一个异常监听器被调用)/ /事件- > stopPropagation ();}}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。