身份验证

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.0,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址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
使用欧宝娱乐app下载地址组件安全Http防火墙ListenerInterface使用欧宝娱乐app下载地址组件安全核心SecurityContextInterface使用欧宝娱乐app下载地址组件安全核心身份验证AuthenticationManagerInterface使用欧宝娱乐app下载地址组件HttpKernel事件GetResponseEvent使用欧宝娱乐app下载地址组件安全核心身份验证令牌UsernamePasswordTokenSomeAuthenticationListener实现了ListenerInterface/ * * *@varSecurityContextInterface * /私人securityContext/ * * *@varAuthenticationManagerInterface * /私人authenticationManager/ * * *@varstring唯一标识安全区域*/私人providerKey/ /……公共函数处理(GetResponseEvent事件请求事件->getRequest ();用户名=……;密码=……;unauthenticatedTokenUsernamePasswordToken (用户名密码->providerKey);authenticatedToken->authenticationManager->验证(unauthenticatedToken);->securityContext->setToken (authenticatedToken);}}

请注意

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

身份验证管理器

的实例AuthenticationProviderManager

12 3 4 5 6 7 8 9 10 11 12 13
使用欧宝娱乐app下载地址组件安全核心身份验证AuthenticationProviderManager// Symfony\Compo欧宝娱乐app下载地址nent\Security\Core\Authentication\AuthenticationProviderInterface的实例供应商数组(…);authenticationManagerAuthenticationProviderManager (供应商);试一试authenticatedTokenauthenticationManager->验证(unauthenticatedToken);}(AuthenticationException失败的) {//认证失败

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

请注意

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

身份验证提供者

每个提供者(因为它实现了AuthenticationProviderInterface)有一个方法支持()通过该方法AuthenticationProviderManager可以确定它是否支持给定的令牌。如果是这种情况,管理器将调用提供者的方法AuthenticationProviderInterface:验证.此方法应返回已验证的令牌或抛出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
使用欧宝娱乐app下载地址组件安全核心身份验证提供者DaoAuthenticationProvider使用欧宝娱乐app下载地址组件安全核心用户UserChecker使用欧宝娱乐app下载地址组件安全核心用户InMemoryUserProvider使用欧宝娱乐app下载地址组件安全核心编码器EncoderFactoryuserProviderInMemoryUserProvider (数组“管理”= >数组//密码为"foo"“密码”= >“5 fz2z8qika7utz4bykoc + GsReLf569mSKDsfods6LYQ8t + a8EW9oaircfMpmaLbPBh4FOBiiFyLfuZmTSUwzZg = =”“角色”= >数组“ROLE_ADMIN”),),));//一些额外的检查:帐户是否启用,锁定,过期等?userCheckerUserChecker ();//密码编码器的数组(见下面)encoderFactoryEncoderFactory(…);提供者DaoAuthenticationProvider (userProvideruserChecker“secured_area”encoderFactory);提供者->验证(unauthenticatedToken);

请注意

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

密码编码器工厂

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

12 3 4 5 6 7 8 9 10 11 12 13 14
使用欧宝娱乐app下载地址组件安全核心编码器EncoderFactory使用欧宝娱乐app下载地址组件安全核心编码器MessageDigestPasswordEncoderdefaultEncoderMessageDigestPasswordEncoder (“sha512”真正的5000);weakEncoderMessageDigestPasswordEncoder (md5的真正的1);编码器数组S欧宝娱乐app下载地址ymfony组件\ \ \ \安全\ \ \ \ \ \用户核心”= >defaultEncoder“Acme \ \ \ \ LegacyUser实体”= >weakEncoder/ /……);encoderFactoryEncoderFactory (编码器);

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

密码编码器

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

12 3 4 5 6 7 8 9 10 11 12 13 14 15
//获取类型为Acme\Entity\LegacyUser的用户用户=……编码器encoderFactory->getEncoder (用户);//返回$weakEncoder(见上文)encodedPassword编码器->encodePassword (密码用户->getSalt ());//检查密码是否有效:validPassword编码器->isPasswordValid (用户->getPassword (),密码用户->getSalt ());
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。