gpt4 book ai didi

symfony - 在 Symfony2 中检查具有多个属性的用户的登录

转载 作者:行者123 更新时间:2023-12-04 08:50:31 25 4
gpt4 key购买 nike

我正在 Symfony2 中构建一个 Multi-Tenancy 应用程序。对于安全的“管理”区域,我有一个自定义实体提供程序(参见:http://symfony.com/doc/current/cookbook/security/entity_provider.html)

但是,Symfony2 似乎只支持在单个属性上检查实体。

my_entity_provider:
entity:
class: SecurityBundle:User
property: email

但是,在我的应用中,一个用户可以拥有多个具有相同电子邮件地址的帐户。我还需要在登录时检查租户 ID 属性。

my_entity_provider:
entity:
class: SecurityBundle:User
property: email, tenantID

我不确定如何在 Symfony2 中实现这一点。在创建新用户时,我已经能够覆盖 loadUsername 方法,但是 Symfony2 安全性中的 login_check 没有使用该方法(而且它真的很难看)。

 public function loadUserByUsername($username)
{
/* we create a concatenated string in the User entity to pass both
the email and tenantId values as the "username" */
$user_parts = explode("|", $username);

$q = $this->createQueryBuilder('u')
->where('u.tenantId = :tenantid AND u.email = :email')
->setParameter('tenantID', $user_parts[1])
->setParameter('email', $user_parts[0])
->getQuery();

try {
$user = $q->getSingleResult();

} catch (NoResultException $e) {
throw new UsernameNotFoundException(sprintf('Unable to find an active User object identified by "%s".', $username), null, 0, $e);
}

return $user;
}

关于实现具有多个属性的自定义安全提供程序的任何指导?谢谢!

最佳答案

您说您使用自定义身份验证提供程序,但我不知道在哪里。我认为您使用 default 实体提供程序,它确实使用关联实体 Repositiory

如果您在配置中定义了一个 property,它将使用存储库 ``findOneBy` 方法。

否则,如果你定义了一个自定义的repositoryClass,并且这个自定义的repository实现了UserPrviderInterface,symfony will call loadUserByUsername

因此,例如调用 loadUserByUsername 方法,只需从 security.yml 中删除 property: email

否则,我想到了许多更清洁的解决方案,但我认为最好的是

这是一个简单的过程:

  • 创建一个实现 UserProviderInterface 的类
  • 为该类创建服务(例如,id 为:app.security.user.provider)
  • 配置 security.yml 以使用此服务

    1. 类:(伪代码,别忘了加上use语句,...)

class UserProvider implements UserProviderInterface
{
public function __construct(ManagerRegistry $doctrine, $tenantIdProvider)
{
$this->doctrine = $doctrine;
$this->tenantIdProvider = $tenantIdProvider;
}

public function loadUserByUsername($username)
{
$this->doctrine->getRepository('App\Entity\User')->findOneBy([
'email' => $username,
'tenant' => $this->tenantIdProvider->getId(), // HERE $tenantIdProvider can be your listener for example.
]);
}

// more methods maybe?
}
  1. 服务(services.yml、app/config/config.yml、...你想要的)

服务:

app.security.user.provider:
class: UserProvider
arguments:
- '@doctrine'
- '@app.tenant_id.provider' #maybe?
  1. 安全配置

安全性:

providers:
user:
id: app.security.user.provider

关于symfony - 在 Symfony2 中检查具有多个属性的用户的登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19076987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com