gpt4 book ai didi

authentication - Symfony:为什么有些用户检查应该在身份验证后执行?

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

我不明白这个。 UserCheckerInterface 有两个方法:checkPreAuthcheckPostAuth。现在让我们看看它们在 UserChecker 类中的实现:

class UserChecker implements UserCheckerInterface
{
/**
* {@inheritdoc}
*/
public function checkPreAuth(UserInterface $user)
{
if (!$user instanceof AdvancedUserInterface) {
return;
}

if (!$user->isAccountNonLocked()) {
$ex = new LockedException('User account is locked.');
$ex->setUser($user);
throw $ex;
}

if (!$user->isEnabled()) {
$ex = new DisabledException('User account is disabled.');
$ex->setUser($user);
throw $ex;
}

if (!$user->isAccountNonExpired()) {
$ex = new AccountExpiredException('User account has expired.');
$ex->setUser($user);
throw $ex;
}
}

/**
* {@inheritdoc}
*/
public function checkPostAuth(UserInterface $user)
{
if (!$user instanceof AdvancedUserInterface) {
return;
}

if (!$user->isCredentialsNonExpired()) {
$ex = new CredentialsExpiredException('User credentials have expired.');
$ex->setUser($user);
throw $ex;
}
}
}

为什么 isCredentialsNonExpired() 应该在身份验证之后完成?难道我们不应该只允许凭据过期的用户进行身份验证吗?还有一个额外的问题:我们应该在哪里真正进行“身份验证后”检查?设置身份验证 token 后?

最佳答案

我认为方法被拆分的原因是因为在使用基于 session 的身份验证时,有些事情您不想每次都检查。

当使用 session 时,Symfony 将序列化 token (和相关用户)。当下一个请求进入时, PreAuthenticatedToken 将包含授权所需的凭据。

预认证 token 的一些示例是:(从 docs 窃取)

  • 基于“记住我”cookie 的身份验证。
  • 基于您的 session 的身份验证。
  • 使用 HTTP 基本或 HTTP 摘要 header 进行身份验证

如果您在 session 中存储了 token ,要提高性能,您可以删除一些检查。 UserCheckerInterface 的唯一示例是由 Symfony 提供的。如您所见,用户帐户的验证是在 preAuth 中完成的,而 postAuth 仅检查凭据是否已过期。

在实际情况下,查看使用这些方法的服务,您会发现没有太大区别。 GuardAuthenticationProvider 按顺序调用两者。

Symfony 的 PreAuthenticatedAuthenticationProvider 只调用 postAuth 所以也许 Symfony 中的某个人决定对于基于 session 的身份验证来减少响应时间几毫秒,他们可以将需要的身份验证检查分开从那些需要对每个请求完成的第一次身份验证中完成。

在您的情况下,如果您要创建自定义 UserChecker,我认为您可以自行决定是否需要同时使用两者。查明您是否有其他 bundle 具有调用这些方法之一的身份验证提供程序。找到所有调用它们的地方,您可能会发现您只需要实现一个,或者,如果您有很多复杂的身份验证逻辑,请将其拆分。

关于authentication - Symfony:为什么有些用户检查应该在身份验证后执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37865414/

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