Symfony 内存管理用户,具有电子邮件身份验证

Stu*_*ent 5 php authentication in-memory symfony

我正在使用扩展 AbstractFormLoginAuthenticator 的类来验证我的应用程序。登录表单包含电子邮件和密码字段。我需要在内存中有一个硬编码的用户,并且能够通过该登录表单登录。我如何配置安全文件才能使其工作?

class LoginFormAuthenticator extends AbstractFormLoginAuthenticator

private $userRepository;
private $router;
private $passwordEncoder;

public function __construct(UserRepository $userRepository, RouterInterface $router, UserPasswordEncoderInterface $passwordEncoder)
{
    $this->userRepository = $userRepository;
    $this->router = $router;
    $this->passwordEncoder = $passwordEncoder;

}

public function supports(Request $request)
{
    return $request->attributes->get('_route') === 'app_login'
        && $request->isMethod('POST');
}

public function getCredentials(Request $request)
{
    $credentials = [
        'email' => $request->request->get('login_form')['email'],
        'password' => $request->request->get('login_form')['plainPassword'],
    ];

    $request->getSession()->set(
        Security::LAST_USERNAME,
        $credentials['email']
    );

    return $credentials;
}

public function getUser($credentials, UserProviderInterface $userProvider)
{
    return $this->userRepository->findOneBy(['email' => $credentials['email']]);
}

public function checkCredentials($credentials, UserInterface $user)
{
    return $this->passwordEncoder->isPasswordValid($user, $credentials['password']);

}

public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
{
    //Redirects to homepage after login
    return new RedirectResponse($this->router->generate('app_homepage'));
}

protected function getLoginUrl()
{
    return $this->router->generate('app_login');
}
Run Code Online (Sandbox Code Playgroud)

在提供者下的 security.yml 文件中我有

in_memory:
        memory:
            users:
                admin@admin.lt:
                    field: email
                    password: $2y$13$st6a8CcDt/X2ng.8b2brEeP0C/MiXSr78er4lTlnWIKzcCJv2ZF8y
                    roles: 'ROLE_ADMIN'
Run Code Online (Sandbox Code Playgroud)

dbr*_*ann 3

您的身份验证器需要一个 UserRepository。您可能有一个与 InMemoryUserProvider 交互的自定义​​存储库,但我建议当您在身份验证器中获取 User 时也使用传递的 UserProviderInterface。根据在提供程序部分中配置的提供程序以及您在防火墙中选择的提供程序,将使用该提供程序。当您只有 1 个 UserProvider(您的 in_memory-provider)时,它将自动在您的防火墙中使用。

在 security.yaml 中,您不需要指定field: email,因为表单字段已通过身份验证器映射到用户名,并且 InMemoryUserProvider 不会以任何方式使用此配置。这意味着您的示例getUser()可能如下所示:

public function getUser($credentials, UserProviderInterface $userProvider)
{
    return $userProvider->loadUserByUsername($credentials['email']);
}
Run Code Online (Sandbox Code Playgroud)

您的身份验证器的其余部分看起来也可以很好地使用它。您在应用程序中必须小心,因为从提供者返回的用户类不是实体,而是 Symfony 本身提供的默认用户类Symfony\Component\Security\Core\User\User

您的提供程序部分security.yaml可能类似于文档中的内容(每个用户仅包含passwordroles),并且在您的防火墙中,您可能希望使用provider: 'in_memory'(或您为提供程序选择的任何其他名称)引用提供程序。