如何解决如何访问Symfony中已登录的Auth0用户的电子邮件地址?
我按照this教程在Symfony中使用Auth0设置了Oauth2登录。
如何访问已登录的Auth0用户的电子邮件地址?
注意:
- 登录成功(通过Google在auth0端通过oauth2,然后重定向回去) 控制器中的
-
$this->getUser()
显示正确的用户名
在 - 范围:
openid profile email
- Auth0记录(在其管理控制台上)包含用户的电子邮件地址
- 文章底部引用了
OAuthUserProvider
来获取用户数据,但是我已经加载了该服务并再次仅获取了用户名
hwi_oauth.yaml
中配置的我的代码与the article I referenced相同。
这是我需要访问其电子邮件地址的控制器,其后是dd($this->getUser()
的输出。
class UserController extends AbstractController
{
/**
* @Route("/user",name="user")
*/
public function index()
{
dd($this->getUser());
return $this->render('user/index.html.twig',[
'controller_name' => 'UserController',]);
}
}
^ HWI \ Bundle \ OAuthBundle \ Security \ Core \ User \ OAuthUser {#580▼
#username:“ coder1”}
解决方法
您必须使用HWI \ Bundle \ OAuthBundle \ Security \ Core \ User \ OAuthUser类扩展您的User实体,并使用您自己的类扩展HWI \ Bundle \ OAuthBundle \ Security \ Core \ User \ OAuthUserProvider类。
然后将其注册为服务,并在防火墙设置中使用它。这是一篇介绍它的文章: https://inchoo.net/dev-talk/symfony-hwioauthbundle-and-google-sign-in/
在OAuthUserProvider类中,您可以修改loadUserByOAuthUserResponse并从数据库中加载用户。
以下是重要的代码段:
更新防火墙
oauth_user_provider:
service: ib_user.oauth_user_provider
添加服务
hwi_oauth.user.provider.entity:
class: HWI\Bundle\OAuthBundle\Security\Core\User\OAuthUserProvider
ib_user.oauth_user_provider:
class: Foggyline\Bundle\TickerBundle\Auth\OAuthProvider
arguments: [@session,@doctrine,@service_container]
这是我正在使用的OAuthProvider类:
<?php
namespace App\Auth;
use App\Repository\UserRepository;
use HWI\Bundle\OAuthBundle\Security\Core\User\OAuthUserProvider;
use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
use App\Entity\User;
class OAuthProvider extends OAuthUserProvider
{
protected $session,$doctrine,$admins,$userRepository;
public function __construct($session,$service_container,UserRepository $userRepository)
{
$this->session = $session;
$this->doctrine = $doctrine;
$this->container = $service_container;
$this->userRepository = $userRepository;
}
public function loadUserByUsername($username)
{
$result = $this->userRepository->findBy(['name' => $username]);
if (count($result)) {
return $result[0];
} else {
return new User($username);
}
}
public function loadUserByEmail($email)
{
$result = $this->userRepository->findBy(['email' => $email]);
if (count($result)) {
return $result[0];
} else {
return new User($email);
}
}
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
//Data from response
$email = $response->getEmail();
$nickname = $response->getNickname();
$realname = $response->getRealName();
$avatar = $response->getProfilePicture();
//set data in session
$this->session->set('email',$email);
$this->session->set('nickname',$nickname);
$this->session->set('realname',$realname);
$this->session->set('avatar',$avatar);
$result = $this->userRepository->findBy(['email' => $email]);
if (!count($result)) {
$user = new User($email);
$user->setName($realname);
$user->setEmail($email);
$user->setRoles(['ROLE_USER']);
$factory = $this->container->get('security.encoder_factory');
$encoder = $factory->getEncoder($user);
$password = $encoder->encodePassword(md5(uniqid()),$user->getSalt());
$user->setPassword($password);
} else {
$user = $result[0];
$user->setUsername($realname);
}
$em = $this->doctrine->getManager();
$em->persist($user);
$em->flush();
//set id
$this->session->set('id',$user->getId());
return $this->loadUserByEmail($response->getEmail());
}
}
,
使用$this->getUser()
,您将从当前登录用户的安全令牌中获取UserInterface对象。因此,您可以访问User实体的所有常规方法。您可以这样:
$currentUser = $this->getUser()->getEmail();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。