使用新的基于验证者的安全性

编辑本页

警告:您正在浏览的文档欧宝官网下载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名称空间应用程序安全使用应用程序实体用户使用学说ORMEntityManagerInterface使用ob娱乐下载组件HttpFoundationJsonResponse使用ob娱乐下载组件HttpFoundation请求使用ob娱乐下载组件HttpFoundation响应使用ob娱乐下载组件安全核心身份验证令牌TokenInterface使用ob娱乐下载组件安全核心异常AuthenticationException使用ob娱乐下载组件安全核心异常CustomUserMessageAuthenticationException使用ob娱乐下载组件安全核心异常UsernameNotFoundException使用ob娱乐下载组件安全Http身份验证AbstractAuthenticator使用ob娱乐下载组件安全Http身份验证护照PassportInterface使用ob娱乐下载组件安全Http身份验证护照SelfValidatingPassportApiKeyAuthenticator扩展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身份验证护照PassportInterfaceLoginAuthenticator扩展AbstractAuthenticator公共函数进行身份验证(请求美元请求PassportInterface美元密码美元请求->请求->get (“密码”);美元用户名美元请求->请求->get (“用户名”);美元csrfToken美元请求->请求->get (“csrf_token”);/ /……从$username中获取$user并验证no//参数为空返回护照(美元用户PasswordCredentials (美元密码), (// $this->userRepository必须实现PasswordUpgraderInterfacePasswordUpgradeBadge (美元密码美元->userRepository),CsrfTokenBadge (“登录”美元csrfToken)));}}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。