ACL + SonataAdminBundle + SonataUserBundle

时间:2015-09-03 16:12:42

标签: symfony acl fosuserbundle sonata-admin sonata-user-bundle

在我的Symfony2项目中,我设法按照官方文档设置了FOSUserBundle + SonataUserBundle + SonataAdminBundle。现在是时候设置ACL(访问控制列表)了。

我做了什么:

  • 创建了一个名为AdminReport

  • 的AdminClass
  • app / console sonata:admin:setup-acl

    install ACL for sonata.admin.report
    update role: ROLE_SONATA_ADMIN_REPORT_GUEST, permissions: ["LIST"]
    update role: ROLE_SONATA_ADMIN_REPORT_STAFF, permissions: ["LIST","CREATE"]
    update role: ROLE_SONATA_ADMIN_REPORT_EDITOR, permissions: ["OPERATOR","EXPORT"]
    • 创建了一个新用户,授予他ROLE_SONATA_ADMIN_REPORT_STAFF
    • app / console sonata:admin:generate-object-acl
    • 使用此用户登录并访问默认的/ admin / dashboard

    包含AdminReport的块应该出现,但它不是......我错过了什么?

这是我的config.yml

sonata_admin:
    security:
        handler: sonata.admin.security.handler.acl
            information:
                GUEST:    [VIEW, LIST]
                STAFF:    [EDIT, LIST, CREATE]
                EDITOR:   [OPERATOR, EXPORT]
                ADMIN:    [MASTER]
            admin_permissions: [CREATE, LIST, DELETE, UNDELETE, EXPORT, OPERATOR, MASTER]
            object_permissions: [VIEW, EDIT, DELETE, UNDELETE, OPERATOR, MASTER, OWNER]

修改 我试图直接访问该用户的app_dev.php / admin / app / report / list,Symfony会抛出Access Denied错误。记录说

  

DEBUG - 拒绝访问,用户既不是匿名的,也不记得我。   如果我访问app_dev.php / admin / app / report / list就可以了!

所以我尝试将处理程序从

sonata.admin.security.handler.acl
更改为
sonata.admin.security.handler.roles

它有效,因为我可以在管理仪表板中看到该块。我还尝试将

access_decision_manager:
        strategy: unanimous
更改为
affirmative
,但它不起作用...

我肯定错过了什么但在哪里?

2 个答案:

答案 0 :(得分:0)

好吧,经过一些调整后,我实现了它的运作。

首先,在 app / config / 中的' sonata.yml '中,我更改了以下内容的权限:

app / config / sonata.yml

# set access_strategy to unanimous, else you may have unexpected behaviors
# access_decision_manager:
#     strategy: unanimous

为了避免这种情况......

  

DEBUG - 访问被拒绝,用户既不是匿名的,也不记得我

...我已经注释掉了以下内容,因为我认为防火墙选民会阻止对我的用户的访问。也许不是更明智的解决方案,但现在运行良好:)

app / config / security.yml

class User extends BaseUser
{
    /**
     * @var integer $id
     */
    protected $id;

    public function __construct() {
        parent::__construct();
        // your own logic
        $this->roles = array('ROLE_USER', 'ROLE_SONATA_ADMIN', 'ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT');
    }

    /**
     * Get id
     *
     * @return integer $id
     */
    public function getId()
    {
        return $this->id;
    }
}

请注意,我的应用程序仅围绕管理员桌面构建,因此每个用户在创建时都需要访问仪表板。 这样,我就修改了我的 User 构造函数:

src / Application / Sonata / UserBundle / Entity / User.php

                        ┌─────────────┐
                        │   GROUP_1   │                 ┌───────────────┐
                        ├─────────────┤                 │     USER_1    │
                        │ CAT2_VIEW   │                 │ applied perms │
                        │ CAT2_LIST   │                 ├───────────────┤
                        │ CAT2_EDIT   │                 │ CAT1_VIEW     │
                        │ CAT2_DELETE │                 │ CAT1_LIST     │
                        ├─────────────┤                 ├───────────────┤
                        │ CAT3_VIEW   │  ├────┐         │ CAT2_VIEW     │
┌─────────────┐         │ CAT3_LIST   │       │         │ CAT2_LIST     │
│   USER_A    │         │ CAT3_EDIT   │       │         │ CAT2_EDIT     │
├─────────────┤<────────┤ CAT3_DELETE │       │         │ CAT2_DELETE   │
│ CAT1_VIEW   │         └─────────────┘       │         ├───────────────┤
│ CAT1_LIST   │                               ├────>    │ CAT3_VIEW     │
│             │         ┌─────────────┐       │         │ CAT3_LIST     │
│             │<────────┤   GROUP_2   │       │         │ CAT3_EDIT     │
└─────────────┘         ├─────────────┤       │         │ CAT3_DELETE   │
                        │ CAT4_VIEW   │       │         ├───────────────┤
                        │ CAT4_LIST   │       │         │ CAT4_VIEW     │
                        │ CAT4_EDIT   │  ├────┘         │ CAT4_LIST     │
                        │ CAT4_DELETE │                 │ CAT4_EDIT     │
                        │ CAT4_EXPORT │                 │ CAT4_DELETE   │
                        └─────────────┘                 │ CAT4_EXPORT   │
                                                        └───────────────┘

编辑: 似乎在不知情的情况下,我回答了你的另一个问题^^“How can I assign default role to user in Symfony2

现在每个用户都可以访问信息中心,但就像您的问题一样,他们看不到任何内容。

我需要使用ACL,但是我的用户属于具有自己ACL的组的角色。

一旦我的用户属于一个或多个组,他就获得了组权限以及他自己的权限。

通过管理一个组的权限,属于该组的每个用户都会修改其权限。通过编辑用户的权限,我可以访问某些组不允许的页面。

例如:

.your-selector:empty::after {
    content: ".";
    visibility: hidden;
}

我设法让它按照我想要的方式工作,但我不知道这是否是您问题的最佳解决方案。 我希望这会对你有所帮助:)。

PS:如果有人看到任何错误或任何不合逻辑的事情,请不要犹豫,在评论中告诉我,我仍然在学习使用它,它会有所帮助:) < / p>

答案 1 :(得分:0)

SonataAdminBundle的PermissionMap扩展了Symfony的BasicPermissionMap。只有当您更改此默认配置时,AclVoter才支持属性“LIST”和“EXPORT”,并且可以投票以授予所需权限。

parameters:
    security.acl.permission.map.class: Sonata\AdminBundle\Security\Acl\Permission\AdminPermissionMap

请参阅我对AclVoter denies access to 'LIST'

的回答