使用新的基于验证者的安全性
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.1,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
使用新的基于验证者的安全性
5.1
基于身份验证器的安全性作为实验功能在Syob娱乐下载mfony 5.1。
在Syob娱乐下载mfony 5.1中,引入了一个新的身份验证系统。这个系统改变了Symfony Security的内部结构,使其更具可扩展性ob娱乐下载和可理解性。
启用系统
方法可以启用基于验证者的系统enable_authenticator_manager
设置:
- YAML
- XML
- PHP
1 2 3 4
#配置/包/ security.yaml安全:enable_authenticator_manager:真正的#……
新系统与当前的认证系统向后兼容,本文将解释一些例外情况:
增加对不安全访问(即匿名用户)的支持
在Syob娱乐下载mfony中,还没有登录到您的网站的访问者会被调用匿名用户.新系统不再具有匿名身份验证。相反,这些会话现在被视为未经身份验证(即没有安全令牌)。当使用isGranted ()
,结果永远是假
(即拒绝),因为这个会话是作为一个没有任何特权的用户处理的。
在access_control
配置后,可以使用新的PUBLIC_ACCESS
安全属性,为未经身份验证的访问(例如登录页面)将一些路由列入白名单:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11
#配置/包/ security.yaml安全:enable_authenticator_manager:真正的#……access_control:#允许未经身份验证的用户访问登录表单-{路径:^ / admin /登录,角色:PUBLIC_ACCESS}#但要求对所有其他管理路由进行认证-{路径:^ /管理,角色:ROLE_ADMIN}
配置认证入口点
有时,一个防火墙有多种身份验证方式(例如,表单登录和API令牌身份验证)。在这些情况下,现在需要配置认证入口点.入口点用于在用户尚未通过身份验证但试图访问需要身份验证的页面时生成响应。例如,这可以用于将用户重定向到登录页面。
属性对其进行配置entry_point
设置:
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13
#配置/包/ security.yaml安全:enable_authenticator_manager:真正的#……防火墙:主要:#允许使用表单或HTTP基本form_login:~http_basic:~#配置表单认证为未认证用户的入口点entry_point:form_login
请注意
您还可以通过创建实现的类来创建自己的身份验证入口点AuthenticationEntryPointInterface.然后你可以设置entry_point
到服务id(例如:entry_point: App \安全\ CustomEntryPoint
)
创建自定义验证器
传统上,安全性可以通过写入来扩展自定义身份验证提供者.基于身份验证器的系统放弃了对这些提供者的支持,并引入了一个新的身份验证器接口作为自定义身份验证方法的基础。
提示
后卫的身份验证器在基于身份验证器的系统中仍然支持。但是,建议在将应用程序重构到新系统时也更新这些参数。新的验证器接口与防护验证器接口有许多相似之处,使得重写更加容易。
身份验证程序应该实现AuthenticatorInterface.你也可以扩展AbstractAuthenticator类的默认实现createAuthenticatedToken ()
适合大多数用例的方法:
12 34 56 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
/ / src /安全/ ApiKeyAuthenticator.php名称空间应用程序\安全;使用应用程序\实体\用户;使用学说\ORM\EntityManagerInterface;使用ob娱乐下载\组件\HttpFoundation\JsonResponse;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\TokenInterface;使用ob娱乐下载\组件\安全\核心\异常\AuthenticationException;使用ob娱乐下载\组件\安全\核心\异常\CustomUserMessageAuthenticationException;使用ob娱乐下载\组件\安全\核心\异常\UsernameNotFoundException;使用ob娱乐下载\组件\安全\Http\身份验证\AbstractAuthenticator;使用ob娱乐下载\组件\安全\Http\身份验证\护照\PassportInterface;使用ob娱乐下载\组件\安全\Http\身份验证\护照\SelfValidatingPassport;类ApiKeyAuthenticator扩展AbstractAuthenticator{私人美元entityManager;公共函数__construct(EntityManagerInterface美元entityManager){美元这->entityManager =美元entityManager;}/** *在每个请求上调用,以决定是否应该为请求使用这个验证器。返回' false '将导致这个验证器*被跳过。* /公共函数支持(请求美元请求): ?保龄球{返回美元请求->头->有(“X-AUTH-TOKEN”);}公共函数进行身份验证(请求美元请求):PassportInterface{美元apiToken=美元请求->头->get (“X-AUTH-TOKEN”);如果(零= = =美元apiToken){//标记头为空,HTTP状态下认证失败//代码401 "未经授权"扔新CustomUserMessageAuthenticationException (“没有提供API令牌”);}美元用户=美元这->entityManager->getRepository(用户::类)->findOneBy ([“apiToken”= >美元apiToken]);如果(零= = =美元用户){扔新UsernameNotFoundException ();}返回新SelfValidatingPassport (美元用户);}公共函数onAuthenticationSuccess(请求美元请求, TokenInterface美元令牌、字符串美元firewallName): ?响应{//如果成功,让请求继续返回零;}公共函数onAuthenticationFailure(请求美元请求, AuthenticationException美元异常): ?响应{美元数据= (//你可能想先自定义或模糊消息“消息”= > strtr (美元异常->getMessageKey (),美元异常->getMessageData ())//或翻译此消息// $this->translator->trans($exception->getMessageKey(), $exception->getMessageData())];返回新JsonResponse (美元数据、响应::HTTP_UNAUTHORIZED);}}
方法可以启用验证程序custom_authenticators
设置:
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13
#配置/包/ security.yaml安全:enable_authenticator_manager:真正的#……防火墙:主要:custom_authenticators:-App \安全\ ApiKeyAuthenticator#不要忘记配置entry_point如果# authenticator实现AuthenticationEntryPointInterface# entry_point: App\Security\CustomFormLoginAuthenticator
的authenticate ()
方法是验证程序中最重要的方法。它的工作是提取凭证(例如用户名和密码,或API令牌)从请求
对象并将其转换为证券护照.
提示
如果要自定义登录表单,还可以从AbstractLoginFormAuthenticator类。
安全护照
护照是一个对象,它包含了要进行身份验证的用户以及其他信息,比如是否应该检查密码或是否应该启用“记住我”功能。
默认的护照需要一个用户对象和凭证。默认支持以下凭据类:
- PasswordCredentials
-
这需要一个明文
美元的密码
方法进行验证为用户配置的密码编码器. - CustomCredentials
-
允许自定义闭包检查凭证:
12 3 4 5 6 7 8 9 10 11 12
/ /……返回新护照(美元用户,新CustomCredentials (//如果这个函数返回的不是' true ',则是credentials . properties//标记为无效。// $credentials参数等于该类的下一个参数函数(美元凭证,用户界面美元用户){返回美元用户->getApiToken () = = =美元凭证;},//自定义凭证美元apiToken));
请注意
如果您不需要检查任何凭据(例如JWT令牌),您可以使用SelfValidatingPassport.这个类只需要一个用户,并且可以选择护照徽章.
护照徽章
的护照
还可选地允许您添加安全徽章.徽章在护照上附加更多的数据(以增加安全性)。默认情况下,支持的徽章如下:
- RememberMeBadge
-
当将此徽章添加到护照时,验证器表示支持remember me。是否真的记得我要看非凡
remember_me
配置。读如何添加“记得我”登录功能获取更多信息。 - PasswordUpgradeBadge
- 这用于在成功登录时自动将密码升级为新的散列。此徽章需要明文密码和密码升级器(例如用户存储库)。看到如何迁移密码哈希.
- CsrfTokenBadge
- 在身份验证期间自动验证此身份验证器的CSRF令牌。构造函数需要一个令牌ID(每个表单唯一)和CSRF令牌(每个请求唯一)。看到如何实施CSRF保护.
- PreAuthenticatedUserBadge
- 指示该用户是预先验证的(即在Symfony初始化之前)。ob娱乐下载这跳过了认证前用户检查器.
例如,如果你想在你的自定义验证器中添加CSRF和密码迁移,你可以像这样初始化护照:
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
/ / src /服务/ LoginAuthenticator.php名称空间应用程序\服务;/ /……使用ob娱乐下载\组件\安全\Http\身份验证\AbstractAuthenticator;使用ob娱乐下载\组件\安全\Http\身份验证\护照\徽章\CsrfTokenBadge;使用ob娱乐下载\组件\安全\Http\身份验证\护照\徽章\PasswordUpgradeBadge;使用ob娱乐下载\组件\安全\Http\身份验证\护照\护照;使用ob娱乐下载\组件\安全\Http\身份验证\护照\PassportInterface;类LoginAuthenticator扩展AbstractAuthenticator{公共函数进行身份验证(请求美元请求):PassportInterface{美元密码=美元请求->请求->get (“密码”);美元用户名=美元请求->请求->get (“用户名”);美元csrfToken=美元请求->请求->get (“csrf_token”);/ /……从$username中获取$user并验证no//参数为空返回新护照(美元用户,新PasswordCredentials (美元密码), (// $this->userRepository必须实现PasswordUpgraderInterface新PasswordUpgradeBadge (美元密码,美元这->userRepository),新CsrfTokenBadge (“登录”,美元csrfToken)));}}