防火墙与授权
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.0,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
防火墙与授权
Security组件的核心是授权。的实例处理AuthorizationCheckerInterface.当认证用户的所有步骤都成功完成后,您可以向授权检查人员询问已认证的用户是否具有应用程序的某个操作或资源的访问权限:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
使用ob娱乐下载\组件\安全\核心\授权\AuthorizationChecker;使用ob娱乐下载\组件\安全\核心\异常\AccessDeniedException;// Symfony\Compob娱乐下载onent\Security\Core\Authentication\Token\Storage\TokenStorageInterface实例$tokenStorage=……;// Symfony\Compob娱乐下载onent\Security\Core\Authentication\AuthenticationManagerInterface实例$authenticationManager=……;// Symfony\Compob娱乐下载onent\Security\Core\Authorization\AccessDecisionManagerInterface实例$accessDecisionManager=……;$authorizationChecker=新AuthorizationChecker ($tokenStorage,$authenticationManager,$accessDecisionManager);/ /……验证用户身份如果(!$authorizationChecker->isGranted (“ROLE_ADMIN”)) {扔新AccessDeniedException ();}
HTTP请求的防火墙
用户认证由防火墙完成。应用程序可能有多个安全区域,因此防火墙使用这些安全区域的映射进行配置。对于这些区域中的每一个,映射都包含一个请求匹配器和一个侦听器集合。请求匹配器使防火墙能够找出当前请求是否指向安全区域。然后监听器会被问到当前请求是否可以用来验证用户:
12 3 4 5 6 7 8 9 10 11 12 13 14
使用ob娱乐下载\组件\安全\Http\FirewallMap;使用ob娱乐下载\组件\HttpFoundation\RequestMatcher;使用ob娱乐下载\组件\安全\Http\防火墙\ExceptionListener;$地图=新FirewallMap ();$requestMatcher=新RequestMatcher (“^ /安全区域”);// Symfony\Compoob娱乐下载nent\Security\Http\Firewall\ListenerInterface的实例$听众=数组(…);$exceptionListener=新ExceptionListener(…);$地图->add ($requestMatcher,$听众,$exceptionListener);
属性所使用的事件分派器以及防火墙映射将作为其第一个参数提供给防火墙HttpKernel:
12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\安全\Http\防火墙;使用ob娱乐下载\组件\HttpKernel\KernelEvents;// HttpKernel使用的EventDispatcher$调度程序=……;$防火墙=新防火墙($地图,$调度程序);$调度程序->addListener (KernelEvents::请求,数组($防火墙,“onKernelRequest”));
防火墙注册监听kernel.request
HttpKernel将在它处理的每个请求开始时分派该事件。这样,防火墙可能会阻止用户超出允许的范围。
防火墙的听众
当防火墙收到kernel.request
事件时,它询问防火墙映射请求是否与安全区域之一匹配。第一个与请求匹配的安全区域将返回一组对应的防火墙侦听器(每个侦听器都实现ListenerInterface).这些侦听器都将被要求处理当前请求。这基本上意味着:找出当前请求是否包含用户可能通过身份验证的任何信息(例如,基本HTTP身份验证侦听器检查请求是否有一个头部被调用PHP_AUTH_USER
).
异常监听器
如果有听众抛出AuthenticationException,将安全区域添加到防火墙映射时提供的异常侦听器将跳入。
异常侦听器根据创建时接收到的参数确定接下来会发生什么。它可能启动身份验证过程,可能要求用户再次提供他们的凭据(当他们仅基于“remember-me”cookie进行身份验证时),或者将异常转换为AccessDeniedHttpException,这将最终导致“HTTP/1.1 403: Access Denied”响应。
入口点
当用户根本没有经过身份验证时(即当令牌存储还没有令牌时),防火墙的入口点将被调用以“开始”身份验证过程。应该实现一个入口点AuthenticationEntryPointInterface,它只有一个方法:start ().这个方法接收电流请求对象和触发异常侦听器的异常。该方法应该返回一个响应对象。例如,这可以是包含登录表单的页面,或者在基本HTTP身份验证的情况下,是带有WWW-Authenticate
头,这将提示用户提供他们的用户名和密码。
流程:防火墙,认证,授权
希望你现在能稍微了解一下安全上下文的“流”是如何工作的:
- 防火墙注册为侦听器
kernel.request
事件; - 在请求开始时,防火墙检查防火墙映射,看看是否有任何防火墙应该为这个URL激活;
- 如果在映射中找到该URL的防火墙,则会通知它的侦听器;
- 每个侦听器检查当前请求是否包含任何身份验证信息——侦听器可能(a)验证用户,(b)抛出错误
AuthenticationException
,或(c)什么都不做(因为请求上没有身份验证信息); - 用户通过身份验证后,您将使用授权拒绝访问某些资源。