Php 没有为资源所有者的实体定义属性
因此,我尝试使用HWI OAuthBundle和FoS UserBundle,以便用户能够从我们的学校凭证进行连接。因此,我应用了中所说的内容,并配置了自定义资源所有者 当我尝试登录时,我被正确地重定向到schools OAuth服务,在该服务中我登录并授权客户端访问我的配置文件,但随后出现以下错误消息: 没有为资源所有者“myecp”的实体定义属性 我尝试了在互联网上找到的几种解决方案,但都不适合我 这是我的密码: config.ymlPhp 没有为资源所有者的实体定义属性,php,symfony,oauth,fosuserbundle,hwioauthbundle,Php,Symfony,Oauth,Fosuserbundle,Hwioauthbundle,因此,我尝试使用HWI OAuthBundle和FoS UserBundle,以便用户能够从我们的学校凭证进行连接。因此,我应用了中所说的内容,并配置了自定义资源所有者 当我尝试登录时,我被正确地重定向到schools OAuth服务,在该服务中我登录并授权客户端访问我的配置文件,但随后出现以下错误消息: 没有为资源所有者“myecp”的实体定义属性 我尝试了在互联网上找到的几种解决方案,但都不适合我 这是我的密码: config.yml #HWIOAuthBundle hwi_oauth:
#HWIOAuthBundle
hwi_oauth:
connect:
account_connector: my.myecp.user_provider
firewall_names: [secured_area]
fosub:
username_iterations: 30
properties:
myecp: myecp_id
resource_owners:
myecp:
type: oauth2
client_id: "%myecp_client_id%"
client_secret: "%myecp_secret%"
access_token_url: https://my.ecp.fr/oauth/v2/token
authorization_url: https://my.ecp.fr/oauth/v2/auth
infos_url: https://my.ecp.fr/api/v1/members/me
user_response_class: HWI\Bundle\OAuthBundle\OAuth\Response\PathUserResponse
paths:
identifier: id
nickname: login
realname: [first_name, last_name]
mail: mail
options:
csrf: true
#FOSUserBundle
fos_user:
db_driver: orm
firewall_name: main
user_class: AppBundle\Entity\Personnes
from_email:
address: "%mailer_user%"
sender_name: "%mailer_user%"
#Services
services:
my.myecp.user_provider:
class: AppBundle\Security\Core\User\FOSUBPersonnesProvider
arguments: ['@fos_user.user_manager', { myecp: myecp_id }]
security.yml:
# To get started with security, check out the documentation:
# http://symfony.com/doc/current/security.html
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
# http://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
providers:
fos_userbundle:
id: fos_user.user_provider.username
# in_memory:
# memory: ~
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
secured_area:
anonymous: ~
oauth:
resource_owners:
myecp: "/login/check"
login_path: /login
use_forward: false
failure_path: /login
oauth_user_provider:
service: my.oauth_aware.user_provider.service
main:
# anonymous: ~
# activate different ways to authenticate
# http_basic: ~
# http://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
# form_login: ~
# http://symfony.com/doc/current/cookbook/security/form_login_setup.html
pattern: ^/
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
logout: true
anonymous: true
access_control:
- { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
services.yml:
services:
# service_name:
# class: AppBundle\Directory\ClassName
# arguments: ["@another_service_name", "plain_value", "%parameter_name%"]
my.oauth_aware.user_provider.service:
class: HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider
arguments:
- '@fos_user.user_manager'
- ['pass properties as array']
routing.yml:
app:
resource: "@AppBundle/Controller/"
type: annotation
hwi_oauth_redirect:
resource: "@HWIOAuthBundle/Resources/config/routing/redirect.xml"
prefix: /connect
hwi_oauth_connect:
resource: "@HWIOAuthBundle/Resources/config/routing/connect.xml"
prefix: /connect
hwi_oauth_login:
resource: "@HWIOAuthBundle/Resources/config/routing/login.xml"
prefix: /login
fos_user:
resource: "@FOSUserBundle/Resources/config/routing/all.xml"
myecp_login:
path: /login/check
logout:
path: /logout
fosubpersonesprovider.php
class FOSUBPersonnesProvider extends BaseFOSUBProvider
{
/**
* {@inheritDoc}
*/
public function connect(UserInterface $user, UserResponseInterface $response)
{
// get property from provider configuration by provider name
// , it will return `myecp_id` in that case (see service definition below)
$property = $this->getProperty($response);
$username = $response->getUsername(); // get the unique user identifier
//on connect - get the access token and the user ID
$service = $response->getResourceOwner()->getName();
$setter = 'set'.ucfirst($service);
$setter_id = $setter.'Id';
$setter_token = $setter.'AccessToken';
//we "disconnect" previously connected users
$existingUser = $this->userManager->findUserBy(array($property => $username));
if (null !== $existingUser) {
$existingUser->$setter_id(null);
$existingUser->$setter_token(null);
$this->userManager->updateUser($existingUser);
}
$user->$setter_id($username);
$user->$setter_token($response->getAccessToken());
$this->userManager->updateUser($user);
}
/**
* {@inheritdoc}
*/
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
$userId = $response->getUsername();
$user = $this->userManager->findUserBy(array('myecpId' => $userId));
// if null just create new user and set it properties
if (null === $user) {
$first_name = $response->getFirstName();
$last_name = $response->getLastName();
$email = $response->getEmail();
$service = $response->getResourceOwner()->getName();
$setter = 'set'.ucfirst($service);
$setter_id = $setter.'Id';
$setter_token = $setter.'AccessToken';
// create new user here
$user = $this->userManager->createUser();
$user->setPrenom($first_name);
$user->setNom($last_name);
$user->setMail($email);
$user->$setter_id($userId);
$user->$setter_token($response->getAccessToken());
$this->userManager->updateUser($user);
return $user;
}
// else update access token of existing user
$user = parent::loadUserByOAuthUserResponse($response);
$serviceName = $response->getResourceOwner()->getName();
$setter = 'set' . ucfirst($serviceName) . 'AccessToken';
$user->$setter($response->getAccessToken());//update access token
return $user;
}
}
谢谢你的帮助 在file services.yml行中的第一个更改,在该行中为user.provider传递参数。 例如,改变最后一行,下面是我为谷歌工作的例子
my.custom.user_provider:
class: YOURBUNDLENAME\Security\Core\MyFOSUBUserProvider
arguments:
- '@fos_user.user_manager'
- arguments: **[ @fos_user.user_manager, { google: googleID }** ]
下一步将$property更改为用户实体的名称属性名称myecp。在我的exmaple中,它是谷歌的$属性位于连接方法下面的fosubpersonesProvider.php中。
My User.php实体看起来像:
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="google_id", type="string", nullable=true)
*/
private $googleID;
我希望这将帮助您对file services.yml行的第一次更改,在该行中,您将参数传递给user.provider。 例如,改变最后一行,下面是我为谷歌工作的例子
my.custom.user_provider:
class: YOURBUNDLENAME\Security\Core\MyFOSUBUserProvider
arguments:
- '@fos_user.user_manager'
- arguments: **[ @fos_user.user_manager, { google: googleID }** ]
下一步将$property更改为用户实体的名称属性名称myecp。在我的exmaple中,它是谷歌的$属性位于连接方法下面的fosubpersonesProvider.php中。
My User.php实体看起来像:
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="google_id", type="string", nullable=true)
*/
private $googleID;
我希望这能帮助你我解决了这个问题
因为这里以数组形式传递参数:
改为:
在合并数组中发送第二个参数时
然后显示错误消息
如果您正在使用Facebook:
如果您正在使用亚马逊:
如果您使用的是Odnoklassniki:
如果您正在使用github:
如果您正在使用谷歌:
我解决了这个问题
因为这里以数组形式传递参数:
改为:
在合并数组中发送第二个参数时
然后显示错误消息
如果您正在使用Facebook:
如果您正在使用亚马逊:
如果您使用的是Odnoklassniki:
如果您正在使用github:
如果您正在使用谷歌:
protected function getProperty(UserResponseInterface $response)
{
$resourceOwnerName = $response->getResourceOwner()->getName();
if (!isset($this->properties[$resourceOwnerName])) {
throw new \RuntimeException(sprintf("No property defined for entity for resource owner '%s'.", $resourceOwnerName));
}
return $this->properties[$resourceOwnerName];
}
arguments: ['@fos_user.user_manager', facebook: facebook ]
arguments: ['@fos_user.user_manager', amazon: amazon ]
arguments: ['@fos_user.user_manager', odnoklassniki: odnoklassniki ]
arguments: ['@fos_user.user_manager', github: github ]
arguments: ['@fos_user.user_manager', google: google ]