![](/img/trans.png)
[英]Silex/Symfony Security: How to perform additional checks for user login?
[英]Additional security checks on Symfony login
我正在使用symfony 2.5,但遇到了障碍。
我根据symfony文档使用SecurityContext
来对用户进行身份验证。 具体来说,我目前有:
$securityContext = $this->container->get('security.context');
# If authenticated through Symfony
if ($securityContext->isGranted('IS_AUTHENTICATED_FULLY'))
{
return $this->redirect($this->generateUrl('accounts_dashboard'), 301);
}
.....
效果很好,但是此应用程序从多个位置注册了用户,当时我们还没有控制重复注册。 这意味着我们对于同一电子邮件地址有多个条目。
因此,当有人尝试登录并且在同一电子邮件地址下有多个帐户时,登录过程将失败,因为它选择了错误的帐户。
我在数据库中还有其他字段可以用来匹配正确的帐户,例如活动状态,上次登录IP甚至上次登录日期。 我的问题是我不确定如何在登录期间创建其他检查以正确验证该信息。
什么是正确的方法而不必重新整理整个登录流程,以便在调用SecurityContext
和其余登录过程之前,可以对数据库中提供的电子邮件地址进行其他检查? 本质上,我只是在尝试提交登录后尝试进行其他检查,以确保选择了正确的帐户,而不是数据库中的第一个匹配项。
您需要实现一个自定义的UserProvider。 例:
<?php
namespace Acme\Security\Authorization;
use Symfony\Bridge\Doctrine\Security\User\EntityUserProvider;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
class MyCustomEmailUserProvider extends EntityUserProvider
{
/**
* {@inheritdoc}
*/
public function loadUserByUsername($username)
{
//your code to get user by email goes here
// if you found User, you need to return it from this method, otherwise throw an exception
throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username));
}
}
您不必扩展EntityUserProvider
,您可以考虑自己的UserProviderInterface
实现。
将其注册为服务(假设使用security.my_custom_email_user_provider
服务名称),添加所需的依赖项,然后将其添加到security.yml
:
providers:
main:
id: security.my_custom_email_user_provider
然后在您的登录表单上使用此提供程序:
firewalls:
firewall_name:
form_login:
provider: main
查阅Cookbook文章以获取更多信息。
UserProvider应该按用户名返回用户,别无其他,它不应执行繁琐的逻辑。 我想你可以尝试创建自己的认证作为解释这里通过实现SimpleFormAuthenticatorInterface
接口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.