如何使用用户名或电子邮件实现身份验证
how to implements auth with username or email
我在我的应用程序中为 symfony 2.8 实现了 lexik jwt 包,我试图通过用户登录或电子邮件使用它,但我无法以任何方式做到这一点。
捆绑包工作正常,但我无法将其配置为能够通过电子邮件或用户名进行身份验证,而且我还没有通过文档或互联网找到如何执行此操作的示例。
我的代码就像文档显示的那样,我试图从 JWTTokenValidator 扩展实现它,但我无法接近。
如何配置它以通过电子邮件或用户名和密码实现用户身份验证?
我通过用户名和电子邮件存档了身份验证,唯一必须做的就是向图书馆提供另一个用户提供者。
您只需要一个实现 UserProviderInterface 的 class,特别是具有自定义身份验证逻辑的 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 }
我在我的应用程序中为 symfony 2.8 实现了 lexik jwt 包,我试图通过用户登录或电子邮件使用它,但我无法以任何方式做到这一点。
捆绑包工作正常,但我无法将其配置为能够通过电子邮件或用户名进行身份验证,而且我还没有通过文档或互联网找到如何执行此操作的示例。
我的代码就像文档显示的那样,我试图从 JWTTokenValidator 扩展实现它,但我无法接近。
如何配置它以通过电子邮件或用户名和密码实现用户身份验证?
我通过用户名和电子邮件存档了身份验证,唯一必须做的就是向图书馆提供另一个用户提供者。 您只需要一个实现 UserProviderInterface 的 class,特别是具有自定义身份验证逻辑的 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 }