我验证我的应用程序扩展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');
}
在所提供security.yml文件我有
in_memory:
memory:
users:
[email protected]:
field: email
password: $2y$13$st6a8CcDt/X2ng.8b2brEeP0C/MiXSr78er4lTlnWIKzcCJv2ZF8y
roles: 'ROLE_ADMIN'
你的鉴定者要求一个UserRepository。你可能有与InMemoryUserProvider交互的定制库,但我会建议是当你在你的鉴定者使用传递以及在UserProviderInterface获得用户。根据其配置无论是在供应商部分,以及你在你的防火墙挑一个,这将是使用提供商。当你只有1个UserProvider(您in_memory提供商),将自动在您的防火墙一起使用。
在你security.yaml你将不再需要为表单字段是由您的认证映射到用户名和InMemoryUserProvider不以任何方式使用此配置指定field: email
。这意味着,例如您的getUser()
看起来是这样的:
public function getUser($credentials, UserProviderInterface $userProvider)
{
return $userProvider->loadUserByUsername($credentials['email']);
}
你的鉴定者的其余部分看起来不错这一工作为好。你将不得不在你的应用为用户级小心你从后面提供商不是一个实体,而是由Symfony的自身Symfony\Component\Security\Core\User\User
提供的默认用户级。
在security.yaml
您的供应商处开始应该像在文档(每个用户只包含password
和roles
),并在防火墙您可能要参考使用provider: 'in_memory'
(或任何其它你选择的供应商名称)提供商。