我的Synfony2应用无法解决服务依赖性问题

时间:2015-03-12 14:59:14

标签: symfony fosuserbundle hwioauthbundle

我正在尝试将FOSUserBundle与HWIBundle集成,以将社交媒体连接添加到我的应用。 FOSUser工作正常,但是我遇到了与HWIOAuthBundle集成的问题。

捆绑包完全加载到AppKernel中。

这是我的config.yml

hwi_oauth:
    connect:
        account_connector: my_user_provider
    firewall_name: name
    fosub:
        username_iterations: 30
        properties:
            facebook: facebook_id
            google: google_id
    resource_owners:
        facebook:
            type:                facebook
            client_id:           "%facebook_app_id%"
            client_secret:       "%facebook_app_secret%"
            scope:               ""
        google:
            type:                google
            client_id:           "%google_app_id%"
            client_secret:       "%google_app_secret%"
            scope:               "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"

这是我的security.yml:

security:
encoders:
    FOS\UserBundle\Model\UserInterface: sha512

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_USER

providers:
    fos_userbundle:
        id: fos_user.user_provider.username_email

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false

    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
            login_path: /login
            check_path: /login_check
        oauth:
            resource_owners:
                facebook:           "/login/check-facebook"
                google:             "/login/check-google"
            login_path:        /login
            failure_path:      /login

            oauth_user_provider:
                service: my_user_provider
        logout:       true
        anonymous:    true

    login:
        pattern:  ^/login$
        security: false

        remember_me:
            key: "%secret%"
            lifetime: 31536000 # 365 days in seconds
            path: /
            domain: ~ # Defaults to the current domain from $_SERVER

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/backend/, role: ROLE_ADMIN }

这是我的Bundle services.yml

parameters:
    my_user_provider.class: Main\SiteBundle\Services\FOSUBUserProvider

services:
    my_user_provider:
        class: "%my_user_provider.class%"
        arguments: [@fos_user.user_manager,{facebook: facebook_id, google: google_id}]

这就是服务:

namespace Main\SiteBundle\Services;

use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseClass;
use Symfony\Component\Security\Core\User\UserInterface;

class FOSUBUserProvider extends BaseClass
{

    /**
     * {@inheritDoc}
     */
    public function connect(UserInterface $user, UserResponseInterface $response)
    {
        $property = $this->getProperty($response);
        $username = $response->getUsername();

        //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
        if (null !== $previousUser = $this->userManager->findUserBy(array($property => $username))) {
            $previousUser->$setter_id(null);
            $previousUser->$setter_token(null);
            $this->userManager->updateUser($previousUser);
        }

        //we connect current user
        $user->$setter_id($username);
        $user->$setter_token($response->getAccessToken());

        $this->userManager->updateUser($user);
    }
    /**
     * {@inheritdoc}
     */
    public function loadUserByOAuthUserResponse(UserResponseInterface $response)
    {
        $username = $response->getUsername();
        $user = $this->userManager->findUserBy(array($this->getProperty($response) => $username));
        //when the user is registrating
        if (null === $user) {
            $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->$setter_id($username);
            $user->$setter_token($response->getAccessToken());
            //I have set all requested data with the user's username
            //modify here with relevant data
            $user->setUsername($username);
            $user->setEmail($username);
            $user->setPassword($username);
            $user->setEnabled(true);
            $this->userManager->updateUser($user);
            return $user;
        }

        //if user exists - go with the HWIOAuth way
        $user = parent::loadUserByOAuthUserResponse($response);

        $serviceName = $response->getResourceOwner()->getName();
        $setter = 'set' . ucfirst($serviceName) . 'AccessToken';

        //update access token
        $user->$setter($response->getAccessToken());

        return $user;
    }

}

是的,这是我在浏览器中遇到的错误:

  

ServiceNotFoundException in   CheckExceptionOnInvalidReferenceBehaviorPass.php第58行:服务   “hwi_oauth.security.oauth_utils”依赖于不存在的   服务“hwi_oauth.resource_ownermap.name”。

在做“作曲家更新”时我得到了这个

  

[Symfony的\元器件\ DependencyInjection \异常\ ServiceNotFoundException的]   服务“hwi_oauth.security.oauth_utils”依赖于a   不存在的服务“hwi_oauth.resource_ownermap.name”。

     

脚本   SENSIO \包\ DistributionBundle \作曲\ ScriptHandler :: clearCache   处理以异常终止的post-update-cmd事件

     

[RuntimeException]执行时发生错误   “'cache:clear --no-warmup'”命令。

1 个答案:

答案 0 :(得分:1)

在config.yml中,您已使用" firewall_name配置hwi_oauth:name"。

但是在security.yml中,你没有带有该名称的防火墙" name" (但是你在config.yml中的hwi_oauth下没有提到" main"命名的防火墙)。这会导致您出现错误消息。