如何自定义访问拒绝响应
编辑本页如何自定义访问拒绝响应
在Syob娱乐下载mfony中,你可以抛出一个AccessDeniedException禁止对用户的访问。ob娱乐下载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
/ / src /安全/ AuthenticationEntryPoint.php名称空间应用程序\安全;使用ob娱乐下载\组件\HttpFoundation\RedirectResponse;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\路由\发电机\UrlGeneratorInterface;使用ob娱乐下载\组件\安全\核心\异常\AuthenticationException;使用ob娱乐下载\组件\安全\Http\入口点\AuthenticationEntryPointInterface;类AuthenticationEntryPoint实现了AuthenticationEntryPointInterface{私人$urlGenerator;公共函数__construct(UrlGeneratorInterface$urlGenerator){$这->urlGenerator =$urlGenerator;}公共函数开始(请求$请求, AuthenticationException$authException= null):RedirectResponse{//添加自定义flash消息并重定向到登录页面$请求->getSession ()->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名称空间应用程序\安全;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\安全\核心\异常\AccessDeniedException;使用ob娱乐下载\组件\安全\Http\授权\AccessDeniedHandlerInterface;类AccessDeniedHandler实现了AccessDeniedHandlerInterface{公共函数处理(请求$请求, AccessDeniedException$accessDeniedException): ?响应{/ /……返回新响应($内容,403);}}
如果你在用默认的服务。yaml的配置,你完蛋了!ob娱乐下载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;使用ob娱乐下载\组件\EventDispatcher\EventSubscriberInterface;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\HttpKernel\事件\ExceptionEvent;使用ob娱乐下载\组件\HttpKernel\KernelEvents;使用ob娱乐下载\组件\安全\核心\异常\AccessDeniedException;类AccessDeniedListener实现了EventSubscriberInterface{公共静态函数getSubscribedEvents():数组{返回[//优先级必须大于安全HTTP// ExceptionListener,以确保它在之前被调用//默认的异常监听器KernelEvents::异常= > [“onKernelException”,2]];}公共函数onKernelException(ExceptionEvent$事件):无效{$异常=$事件->getThrowable ();如果(!$异常运算符AccessDeniedException) {返回;}/ /……执行一些操作(例如记录日志)//可选设置自定义响应$事件->setResponse (新响应(零,403));//或停止传播(阻止下一个异常监听器被调用)/ /事件- > stopPropagation ();}}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。