自定义表单密码身份验证器仅返回UserInterface symfony

时间:2015-06-05 20:31:45

标签: php symfony

Symfony工具 - 自定义表单密码验证器 http://symfony.com/doc/current/cookbook/security/custom_password_authenticator.html

因此,这部分代码通过UserProviderInterface获取在services.yml中定义的用户提供程序类,并返回UserInterface

public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
{
    try {
        $user = $userProvider->loadUserByUsername($token->getUsername());

默认情况下,我的自定义用户类提供程序实现了AdvancedUserInterface以及更多功能:http://api.symfony.com/2.6/Symfony/Component/Security/Core/User/AdvancedUserInterface.html

class Users implements AdvancedUserInterface, \Serializable

问题:如何使用AdvancedUserInterface实施UserProviderInterface。或者我只需要手动重新创建这个AdvancedUserInterface函数并在加载用户对象后手动检查?

感谢。我希望你明白。

编辑: 它看起来像自动调整自定义密码认证中没有调用的AdvancedUser接口函数。 所以在获取用户对象后需要调用手动这个函数

   try {
        $user = $userProvider->loadUserByUsername($token->getUsername());
        if ($user->isAccountNonExpired()){ throw new AuthenticationException('expired');}
        if ($user->isAccountNonLocked()){ throw new AuthenticationException('locked');}
        if ($user->isCredentialsNonExpired()){ throw new AuthenticationException('credExpired');}
        if (!$user->isEnabled()){ throw new AuthenticationException('disabled');}

1 个答案:

答案 0 :(得分:2)

你可能有些困惑。

AdvancedUserInterface - 表示用户实例,并从UserInterface扩展。

UserProviderInterface - 表示加载用户的提供商(UserInterface)。

在方法loadUserByUsername中,您可以返回AdvancedUserInterface个实例。

例如:

用户:

class User implements AdvancedUserInterface
{
  // .. Some fields and functions
}

用户提供商:

class MyUserProvider implements UserProviderInterface
{
  public function loadUserByUsername($username)
  {
     // Get the User instance from DB or another system
     return $user;
  }

  // Some functions
}