Php 具有外部用户源的OAuth2服务器

Php 具有外部用户源的OAuth2服务器,php,symfony,oauth,fosoauthserverbundle,Php,Symfony,Oauth,Fosoauthserverbundle,我正在用这个伟大的包构建一个OAuth2服务器 My Symfony应用程序对来自其他来源(实际上是另一台服务器)的用户进行身份验证 我创建了一个自定义的UserProvider,它可以与默认的Symfony安全层配合使用。我有UserInterface的实现,但它显然不是数据库的实体 实现了类for和as for原则,我将用户引用定义为 /。。。 /** *@ORM\Column(type=“integer”) */ 受保护的$user\u id; //... 在那之前它看起来合乎逻辑吗 现

我正在用这个伟大的包构建一个OAuth2服务器

My Symfony应用程序对来自其他来源(实际上是另一台服务器)的用户进行身份验证

我创建了一个自定义的
UserProvider
,它可以与默认的Symfony安全层配合使用。我有
UserInterface
的实现,但它显然不是数据库的实体

实现了类for和as for原则,我将用户引用定义为

/。。。
/**
*@ORM\Column(type=“integer”)
*/
受保护的$user\u id;
//...
在那之前它看起来合乎逻辑吗

现在真正的问题是: 在哪里指定将用户链接到不同令牌的方式?



我也参与了官方回购协议的公开发行

我最终做了两件事:

  • 覆盖属性
    user
  • 使用条令
    LifecycleEvent
    侦听器
首先扩展令牌类(例如使用)

名称空间AppBundle\Entity;
使用AppBundle\Security\User;
使用Symfony\Component\Security\Core\User\UserInterface;
性状
{
/**
*@ORM\Column(type=“string”)
*@var字符串
*/
受保护的$username;
公共函数setUser(UserInterface$user)
{
if(!$user instanceof user){
抛出新\InvalidArgumentException(
sprintf(“用户必须是%s的实例”,用户::类)
);
}
$this->username=$user->getUsername();
$this->user=$user;
}
公共函数getUser()
{
如果(!$this->user){
抛出新的\RuntimeException(
“无法获取用户-postLoad未加载用户”
);
}
返回$this->user;
}
/**
*@返回字符串
*/
公共函数getUsername()
{
返回$this->username;
}
}
在3个令牌类中(不要忘记更新数据库模式):

创建侦听器

namespace-AppBundle\Services;
使用AppBundle\Entity\AccessToken;
使用AppBundle\Entity\AuthCode;
使用AppBundle\Entity\RefreshToken;
使用AppBundle\Security\UserProvider;
使用条令\ORM\Event\LifecycleEventArgs;
类AppTokenListener
{
/**
*@var UserProvider
*/
受保护的$userProvider;
公共函数构造(UserProvider$UserProvider)
{
$this->userProvider=$userProvider;
}
公共函数加载后(LifecycleEventArgs$事件)
{
$object=$event->getObject();
如果(
$object instanceof AccessToken
$object instanceof AuthCode或
$object instanceof RefreshToken
) {
$user=$this->userProvider->loadUserByUsername($object->getUsername());
$object->setUser($user);
}
}
}
将其注册为服务

app.token.listener:
    class: AppBundle\Services\AppTokenListener
    tags:
        - { name: doctrine.event_listener, event: postLoad }

用户对象现在应该总是附加到令牌上

Hi Pierre,你的帖子确实帮助我设置了类似的配置。我已经从oauth端启动并运行了所有内容,但是使用访问令牌调用api会导致一个致命错误:“错误:在***/OAuthBundle/Services/SecurityTokenListener.php第41行调用非对象上的成员函数loadUserByUsername(),其中第41行是$user=$this->userProvider->loadUserByUsername($object->getUsername());“看来,构造函数从未被调用过。你知道,这是怎么回事吗?谢谢,ChrisAll我记得在将
userProvider
注入监听器时,这里有一个循环引用问题,我看到这是一个已知的问题,我以一种非常肮脏的方式解决了它。现在,服务只需要用户提供程序作为一个函数。”参数,并且您的AppTokenListener在构造函数中缺少一个“u”。复制/粘贴不是一个好主意:-)您是如何通过此循环引用的?
app.token.listener:
    class: AppBundle\Services\AppTokenListener
    tags:
        - { name: doctrine.event_listener, event: postLoad }