身份验证

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

身份验证

当请求指向安全区域时,防火墙映射中的一个侦听器能够从当前数据中提取用户的凭据请求对象时,它应该创建一个令牌,其中包含这些凭据。侦听器应该做的下一件事是请求身份验证管理器验证给定的令牌,并返回通过身份验证令牌,如果发现所提供的凭证是有效的。侦听器然后应该使用存储经过身份验证的令牌令牌存储

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 38 39 40 41 42 43 44 45
使用ob娱乐下载组件HttpKernel事件GetResponseEvent使用ob娱乐下载组件安全核心身份验证AuthenticationManagerInterface使用ob娱乐下载组件安全核心身份验证令牌存储TokenStorageInterface使用ob娱乐下载组件安全核心身份验证令牌UsernamePasswordToken使用ob娱乐下载组件安全Http防火墙ListenerInterfaceSomeAuthenticationListener实现了ListenerInterface/ * * *@varTokenStorageInterface * /私人tokenStorage/ * * *@varAuthenticationManagerInterface * /私人authenticationManager/ * * *@varstring唯一标识安全区域*/私人providerKey/ /……公共函数处理(GetResponseEvent事件请求事件->getRequest ();用户名=……;密码=……;unauthenticatedTokenUsernamePasswordToken (用户名密码->providerKey);authenticatedToken->authenticationManager->验证(unauthenticatedToken);->tokenStorage->setToken (authenticatedToken);}}

请注意

令牌可以是任何类,只要它实现了TokenInterface

身份验证管理器

的实例AuthenticationProviderManager

12 3 4 5 6 7 8 9 10 11 12 13 14
使用ob娱乐下载组件安全核心身份验证AuthenticationProviderManager使用ob娱乐下载组件安全核心异常AuthenticationException// Symfony\Compoob娱乐下载nent\Security\Core\Authentication\Provider\AuthenticationProviderInterface的实例供应商=[…];authenticationManagerAuthenticationProviderManager (供应商);试一试authenticatedTokenauthenticationManager->验证(unauthenticatedToken);}(AuthenticationException异常) {//认证失败

AuthenticationProviderManager实例化时,接收多个身份验证提供者,每个提供者支持不同类型的令牌。

请注意

您可以编写自己的身份验证管理器,它只需要实现即可AuthenticationManagerInterface

身份验证提供者

每个提供者(因为它实现了AuthenticationProviderInterface)有一个支持()所采用的方法AuthenticationProviderManager可以确定它是否支持给定的令牌。如果是这种情况,管理器将调用提供者的服务authenticate ()方法。此方法应返回已验证的令牌或抛出AuthenticationException(或任何其他扩展它的异常)。

通过用户名和密码认证用户

身份验证提供者将尝试根据用户提供的凭据对用户进行身份验证。通常是用户名和密码。大多数web应用程序存储用户的用户名和用户密码的散列,并结合随机生成的salt。这意味着平均身份验证将包括从用户数据存储中获取salt和散列密码,将用户刚刚提供的密码(例如使用登录表单)与salt进行散列,并将两者进行比较,以确定给定的密码是否有效。

类提供了此功能DaoAuthenticationProvider.对象中获取用户的数据UserProviderInterface,使用PasswordEncoderInterface创建密码散列,如果密码有效,则返回一个已验证的令牌:

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
使用ob娱乐下载组件安全核心身份验证提供者DaoAuthenticationProvider使用ob娱乐下载组件安全核心编码器EncoderFactory使用ob娱乐下载组件安全核心用户InMemoryUserProvider使用ob娱乐下载组件安全核心用户UserCheckeruserProviderInMemoryUserProvider ([“管理”= > [//密码为"foo"“密码”= >“5 fz2z8qika7utz4bykoc + GsReLf569mSKDsfods6LYQ8t + a8EW9oaircfMpmaLbPBh4FOBiiFyLfuZmTSUwzZg = =”“角色”= > [“ROLE_ADMIN”],],]);//一些额外的检查:帐户是否启用,锁定,过期等。userCheckerUserChecker ();//密码编码器的数组(见下面)encoderFactoryEncoderFactory(…);daoProviderDaoAuthenticationProvider (userProvideruserChecker“secured_area”encoderFactory);daoProvider->验证(unauthenticatedToken);

请注意

上面的示例演示了“内存中”用户提供程序的使用,但您可以使用任何用户提供程序,只要它实现了即可UserProviderInterface.方法也可以让多个用户提供程序尝试查找用户的数据ChainUserProvider

密码编码器工厂

DaoAuthenticationProvider使用编码器工厂为给定类型的用户创建密码编码器。这允许您针对不同类型的用户使用不同的编码策略。默认的EncoderFactory接收编码器数组:

12 3 4 5 6 7 8 9 10 11 12 13 14
使用Acme实体LegacyUser使用ob娱乐下载组件安全核心编码器EncoderFactory使用ob娱乐下载组件安全核心编码器MessageDigestPasswordEncoder使用ob娱乐下载组件安全核心用户用户defaultEncoderMessageDigestPasswordEncoder (“sha512”真正的5000);weakEncoderMessageDigestPasswordEncoder (md5的真正的1);编码器=[用户]::类= >defaultEncoder, LegacyUser::类= >weakEncoder/ /……];encoderFactoryEncoderFactory (编码器);

每个编码器都应该实现PasswordEncoderInterface或者是一个带有a的数组和一个参数键,该键允许编码器工厂仅在需要时构造编码器。

创建自定义密码编码器

有许多内置的密码编码器。但如果你需要创建自己的,它只需要遵循以下规则:

  1. 类必须实现PasswordEncoderInterface
  2. 的实现encodePassword ()而且isPasswordValid ()首先必须确保密码不太长,即密码长度不超过4096个字符。这是出于安全原因(参见cve - 2013 - 5750),你可以使用isPasswordTooLong ()检查方法:

    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
    使用ob娱乐下载组件安全核心编码器BasePasswordEncoder使用ob娱乐下载组件安全核心异常BadCredentialsExceptionFoobarEncoder扩展BasePasswordEncoder公共函数encodePassword如果->isPasswordTooLong ()) {BadCredentialsException (无效的密码。);}/ /……公共函数isPasswordValid编码如果->isPasswordTooLong ()) {返回;}/ /……}}

使用密码编码器

getEncoder ()方法调用时,将user对象作为其第一个参数,则它将返回类型为的编码器PasswordEncoderInterface应该用来编码这个用户的密码:

12 3 4 5 6 7 8 9 10 11 12 13 14
// Acme\Entity\LegacyUser用户=……;//提交的密码,例如注册时plainPassword=……;编码器encoderFactory->getEncoder (用户);//返回$weakEncoder(见上文)encodedPassword编码器->encodePassword (plainPassword用户->getSalt ());用户->向setPassword (encodedPassword);/ /……保存用户

现在,当你想检查提交的密码是否正确时(例如,当你试图登录时),你可以使用:

1 2 3 4 5 6 7 8 9 10 11
//获取Acme\Entity\LegacyUser用户=……;//提交的密码,例如从登录表单plainPassword=……;validPassword编码器->isPasswordValid (用户->getPassword (),//编码的密码plainPassword//提交的密码用户->getSalt ());

验证事件

安全组件提供了4个相关的身份验证事件:

的名字 事件不断 参数传递给监听器
security.authentication.success AuthenticationEvents: AUTHENTICATION_SUCCESS AuthenticationEvent
security.authentication.failure AuthenticationEvents: AUTHENTICATION_FAILURE AuthenticationFailureEvent
security.interactive_login SecurityEvents: INTERACTIVE_LOGIN InteractiveLoginEvent
security.switch_user SecurityEvents: SWITCH_USER SwitchUserEvent

认证成功和失败事件

当提供者对用户进行身份验证时,asecurity.authentication.success事件被分派。但是要注意-这个事件会触发,例如,在每一个如果您有基于会话的身份验证,则请求。看到security.interactive_login下面如果你需要做些什么当用户实际上登录。

当提供者尝试身份验证但失败时(即抛出AuthenticationException),一个security.authentication.failure事件被分派。你可以听security.authentication.failure事件,以便记录失败的登录尝试。

安全事件

security.interactive_login事件在用户主动登录到您的网站后触发。重要的是要将此操作与非交互式身份验证方法区分开来,例如:

  • 基于会话的身份验证。
  • 使用HTTP基本标头进行身份验证。

你可以听security.interactive_login事件,以便在用户每次登录时给他们一个欢迎的闪光消息。

security.switch_user事件将在每次激活switch_user防火墙侦听器。

另请参阅

有关切换用户的详细信息,请参见如何模拟用户

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。