首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FOSFacebookBundle可以工作,但FOSUserBundle似乎不能工作

FOSFacebookBundle可以工作,但FOSUserBundle似乎不能工作
EN

Stack Overflow用户
提问于 2012-07-24 03:33:30
回答 2查看 995关注 0票数 1

我可以用FOSFacebookBundle登录,一切都正常。但是,FOSUserBundle似乎不起作用,因为分析器显示用户名:匿名和角色:{}。而且,数据库中没有登录用户的用户数据。也许,我不明白它是如何工作的。求求你帮帮我。

这是我的config.yml

代码语言:javascript
复制
fos_user:
 db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
 firewall_name: public
 user_class: Trade\TradeBundle\Entity\User

fos_facebook:
  file:   %kernel.root_dir%/../vendor/facebook/src/base_facebook.php
  alias:  facebook
  app_id: my_app_id
  secret: app_secret_key
  cookie: true
  permissions: [user_about_me]

services:
 fos_facebook.auth:
    class: Trade\TradeBundle\Security\User\Provider\FacebookProvider
    arguments:
        facebook: "@fos_facebook.api"
        userManager: "@fos_user.user_manager"
        validator: "@validator"
        container: "@service_container"

这是我的security.yml

代码语言:javascript
复制
security:
factories:
    - "%kernel.root_dir%/../vendor/bundles/FOS/FacebookBundle/Resources/config/security_factories.xml"

role_hierarchy:
    ROLE_ADMIN:       ROLE_FACEBOOK
    ROLE_SUPER_ADMIN: ROLE_ADMIN

providers:
    my_fos_facebook:
        id: fos_facebook.auth

firewalls:
    public:
        pattern:   ^/.*
        fos_facebook:
            app_url: "app_url"
            server_url: "server_url"
            login_path: /user/login
            check_path: /user/login_check
            default_target_path: /
            provider: my_fos_facebook
        anonymous: true
        logout:
            handlers: ["fos_facebook.logout_handler"]

下面的代码似乎不起作用,因为当我使用facebook setTimeout(goLogIn,500)登录时,里面的if函数没有被调用。

代码语言:javascript
复制
function goLogIn(){
    window.location.href = "{{ path('user_login_check') }}";
}

function onFbInit() {
    if (typeof(FB) != 'undefined' && FB != null ) {
        FB.Event.subscribe('auth.statusChange', function(response) {
            if (response.session || response.authResponse) {
                setTimeout(goLogIn, 500);
            } else {
                window.location.href = "{{ path('_security_logout') }}";
            }
       });
    }
}

以下是我的控制器操作:

代码语言:javascript
复制
/**
 * @Route("/user/login", name = "user_login")
 */
public function loginAction()
{

}

/**
 * @Route("/user/login_check", name = "user_login_check")
 */
public function loginCheckAction()
{

}
EN

回答 2

Stack Overflow用户

发布于 2012-07-25 20:28:33

为了让FOSUserBundle与FOSFacebookBundle协同工作,您需要为security.yml上的facebook登录指定特定的登录路由

代码语言:javascript
复制
  public:
    fos_facebook:
        check_path: /loginFacebook

当然,您需要将该路由正确地指向routing.yml

代码语言:javascript
复制
_security_check:
pattern: /loginFacebook

然后,您需要更改facebook javascript上的检查URL:

代码语言:javascript
复制
function goLogIn(){
    window.location.href = "{{ path('_security_check') }}";
}

最后一件事是为新的路由创建控制器和操作(这非常重要,否则它将无法工作),并将其保留为空:

代码语言:javascript
复制
public function loginFacebookAction()
{
    return array();
}

当然,您需要根据自己的需要对此进行调整,就像我使用DefaultController时,您显然也会使用UserController

希望能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2012-07-24 09:50:52

我猜您存储空数据是因为您的权限请求:

代码语言:javascript
复制
permissions: [user_about_me]

我建议更改为推荐的教程:

代码语言:javascript
复制
permissions: [email, user_birthday, user_location]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11619245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档