如何访问Symfony中已登录的Auth0用户的电子邮件地址?

如何解决如何访问Symfony中已登录的Auth0用户的电子邮件地址?

我按照this教程在Symfony中使用Auth0设置了Oauth2登录。

如何访问已登录的Auth0用户的电子邮件地址?

注意:

  • 登录成功(通过Google在auth0端通过oauth2,然后重定向回去)
  • 控制器中的
  • $this->getUser()显示正确的用户名
  • hwi_oauth.yaml中配置的
  • 范围:openid profile email
  • Auth0记录(在其管理控制台上)包含用户的电子邮件地址
  • 文章底部引用了OAuthUserProvider来获取用户数据,但是我已经加载了该服务并再次仅获取了用户名

我的代码与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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-