【问题标题】:Authentication access control ROLES身份验证访问控制角色
【发布时间】:2013-03-18 16:30:47
【问题描述】:

使用 symfony2.1 和 FOSFacebookBundle:

如果用户正在输入 www.example.com,例如用户关闭了他的浏览器,然后如果他仍然经过身份验证,我想重定向到 www.example.com/secured。

如果用户通过身份验证,我无法进入 indexAction。

我的 Security.yml:

security:
encoders:
    Symfony\Component\Security\Core\User\User: plaintext

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

providers:
    in_memory:
        memory:
            users:
                user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
    my_fos_facebook_provider:
            id: my.facebook.user
                 //How can I add here a ROLE_USER?

firewalls:

     //standard thing from FosFacebookBundle

access_control:
    - { path: ^/, roles: [IS_AUTHENTICATED_ANONYMOUSLY]  } 

我的索引操作:

if( $this->container->get('security.context')
    ->isGranted('IS_AUTHENTICATED_FULLY') ){
   echo 'asdf'; //this is working in the secured area www.example.com/secured/
}

我的错误信息: 安全上下文不包含身份验证令牌。一个可能的原因可能是没有为此 URL 配置防火墙。

在安全区域中,用户没有任何角色。怎么改?

怎么了?

更新

namespace Frontend\FbAccountBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

 /**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity
 */
class User
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="bigint", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

/**
 * @var integer
 *
 * @ORM\Column(name="facebook_id", type="bigint", nullable=false)
 */
private $facebookId;
/**
 * @param Array
 */
public function setFBData($fbdata)
{
    if (isset($fbdata['id'])) {
        $this->setFacebookId($fbdata['id']);
        $this->addRole('ROLE_FACEBOOK');
    }
}

security.yml:

services:
my.facebook.user:
    class: Frontend\FbAccountBundle\Security\User\Provider\FacebookProvider
    arguments:
        facebook: "@fos_facebook.api"
        userManager: "@fos_user.user_manager"
        validator: "@validator"
        container: "@service_container"

【问题讨论】:

    标签: symfony fosuserbundle fosfacebookbundle


    【解决方案1】:

    您需要编写一个用户提供程序来将角色添加到您的用户。这在 FOSFacebookBundle 文档中有介绍。查看页面底部附近 User 实体上的服务定义和 setFBData 方法。这应该会给你一个坚实的开端。

    Integration with FOSUserBundle

    【讨论】:

    • 我这样做了,但由于我的实体,我无法扩展它。我更新了我的代码。