Как реализовать аутентификацию с именем пользователя или электронной почтой
Я реализовал пакет lexik jwt для symfony 2.8 в своем приложении и пытаюсь использовать его с логином или электронной почтой, но я никак не мог это сделать.
Пакет работает правильно, но я не смог настроить его для аутентификации по электронной почте или по имени пользователя, и я не нашел примеров того, как сделать это через документацию или Интернет.
мой код похож на показ документации, я пытался реализовать его, начиная с JWTTokenValidator, но я не смог приблизиться.
Как я могу настроить его для обеспечения аутентификации пользователя по электронной почте или по имени пользователя и паролю?
1 ответ
Я заархивировал аутентификацию по имени пользователя и электронной почте, единственное, что нужно сделать, - это предоставить другому провайдеру пользователя библиотеку. Вам нужен только класс, который реализует UserProviderInterface, в частности метод loadUserByUsername с вашей пользовательской логикой аутентификации. А затем внедрить его как зависимость в службу lexik jwt. например:
class AuthUserProvider implements UserProviderInterface
{
/**
* @var UserRepository
*/
private $userManager;
public function __construct(UserManager $userManager)
{
$this->userManager = $userManager;
}
public function loadUserByUsername($username)
{
$foundedUser = $this->userManager->findUserByUsernameOrEmail($username);
if ($foundedUser === null) {
throw new UsernameNotFoundException();
}
return $foundedUser;
}
public function refreshUser(UserInterface $user)
{
// TODO: Implement refreshUser() method.
}
public function supportsClass($class)
{
// TODO: Implement supportsClass() method.
}
}
мой пакет service.yml выглядит так:
api_bundle.security.auth_user_provider:
class: Project\TheOwn\ApiBundle\Security\AuthUserProvider
arguments:
- '@the_own.core.manager.user'
public: true
и мой security.yml:
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
providers:
auth_user_provider:
id: api_bundle.security.auth_user_provider
firewalls:
login:
pattern: ^/api/signin
stateless: true
anonymous: true
provider: auth_user_provider
form_login:
check_path: /api/signin
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
require_previous_session: false
api:
pattern: ^/api/
security: true
stateless: true
provider: auth_user_provider
guard:
authenticators:
- lexik_jwt_authentication.jwt_token_authenticator
access_control:
- { path: ^/api/signin, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api, roles: IS_AUTHENTICATED_FULLY }