具有电子邮件身份验证的内存管理员用户中的 Symfony
Symfony in memory admin user with email authentication
我正在使用扩展 AbstractFormLoginAuthenticator 的 class 验证我的应用程序。登录表单包含电子邮件和密码字段。我需要在内存中有一个硬编码的用户,并且能够通过该登录表单登录。我如何配置安全文件才能使其正常工作?
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');
}
在供应商下的 security.yml 文件中我有
in_memory:
memory:
users:
admin@admin.lt:
field: email
password: y$st6a8CcDt/X2ng.8b2brEeP0C/MiXSr78er4lTlnWIKzcCJv2ZF8y
roles: 'ROLE_ADMIN'
您的身份验证器要求一个 UserRepository。您可能有一个与 InMemoryUserProvider 交互的自定义存储库,但我建议您让身份验证器中的用户也使用传递的 UserProviderInterface。根据在提供者部分中配置的提供者以及您在防火墙中选择的提供者,将使用它。当您只有 1 个 UserProvider(您的 in_memory-provider)时,将自动在您的防火墙中使用。
在您的 security.yaml 中,您不需要指定 field: email
,因为您的身份验证器会将表单字段映射到用户名,并且 InMemoryUserProvider 不会以任何方式使用此配置。这意味着例如您的 getUser()
可能如下所示:
public function getUser($credentials, UserProviderInterface $userProvider)
{
return $userProvider->loadUserByUsername($credentials['email']);
}
您的身份验证器的其余部分看起来也很适合使用它。你在你的应用程序中必须小心,因为你从提供者那里得到的 User-class 不是实体,而是 Symfony 本身提供的默认 User-class Symfony\Component\Security\Core\User\User
.
您在 security.yaml
中的提供者部分可能看起来像文档中的那样(每个用户仅包含 password
和 roles
),并且在您的防火墙中您可能希望引用提供者使用provider: 'in_memory'
(或您为提供商选择的任何其他名称)。
我正在使用扩展 AbstractFormLoginAuthenticator 的 class 验证我的应用程序。登录表单包含电子邮件和密码字段。我需要在内存中有一个硬编码的用户,并且能够通过该登录表单登录。我如何配置安全文件才能使其正常工作?
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');
}
在供应商下的 security.yml 文件中我有
in_memory:
memory:
users:
admin@admin.lt:
field: email
password: y$st6a8CcDt/X2ng.8b2brEeP0C/MiXSr78er4lTlnWIKzcCJv2ZF8y
roles: 'ROLE_ADMIN'
您的身份验证器要求一个 UserRepository。您可能有一个与 InMemoryUserProvider 交互的自定义存储库,但我建议您让身份验证器中的用户也使用传递的 UserProviderInterface。根据在提供者部分中配置的提供者以及您在防火墙中选择的提供者,将使用它。当您只有 1 个 UserProvider(您的 in_memory-provider)时,将自动在您的防火墙中使用。
在您的 security.yaml 中,您不需要指定 field: email
,因为您的身份验证器会将表单字段映射到用户名,并且 InMemoryUserProvider 不会以任何方式使用此配置。这意味着例如您的 getUser()
可能如下所示:
public function getUser($credentials, UserProviderInterface $userProvider)
{
return $userProvider->loadUserByUsername($credentials['email']);
}
您的身份验证器的其余部分看起来也很适合使用它。你在你的应用程序中必须小心,因为你从提供者那里得到的 User-class 不是实体,而是 Symfony 本身提供的默认 User-class Symfony\Component\Security\Core\User\User
.
您在 security.yaml
中的提供者部分可能看起来像文档中的那样(每个用户仅包含 password
和 roles
),并且在您的防火墙中您可能希望引用提供者使用provider: 'in_memory'
(或您为提供商选择的任何其他名称)。