Symfony使用与电子邮件认证的内存管理用户

问题描述 投票:1回答:1

我验证我的应用程序扩展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'
php symfony authentication login in-memory
1个回答
0
投票

你的鉴定者要求一个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您的供应商处开始应该像在文档(每个用户只包含passwordroles),并在防火墙您可能要参考使用provider: 'in_memory'(或任何其它你选择的供应商名称)提供商。

© www.soinside.com 2019 - 2024. All rights reserved.