【问题标题】:ACL + SonataAdminBundle + SonataUserBundleACL + SonataAdminBundle + SonataUserBundle
【发布时间】:2015-11-29 14:05:17
【问题描述】:

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

我做了什么:

  • 创建了一个名为 AdminReport 的 AdminClass

  • 应用/控制台奏鸣曲:admin:setup-acl

    为 sonata.admin.report 安装 ACL
    更新角色:ROLE_SONATA_ADMIN_REPORT_GUEST,权限:["LIST"]
    更新角色:ROLE_SONATA_ADMIN_REPORT_STAFF,权限:["LIST","CREATE"]
    更新角色:ROLE_SONATA_ADMIN_REPORT_EDITOR,权限:["OPERATOR","EXPORT"]
    • 创建了一个新用户,授予他 ROLE_SONATA_ADMIN_REPORT_STAFF
    • app/console sonata:admin:generate-object-acl
    • 使用此用户登录并访问默认的 /admin/dashboard

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

这是我的 config.yml

奏鸣曲管理员:
    安全:
        处理程序:sonata.admin.security.handler.acl
            信息:
                客人:[查看,列表]
                工作人员:[编辑、列表、创建]
                编辑:[操作员,出口]
                管理员:[大师]
            admin_permissions:[创建、列表、删除、取消删除、导出、操作员、主]
            object_permissions: [查看、编辑、删除、取消删除、操作员、主控、所有者]

编辑 我试图用这个用户直接访问 app_dev.php/admin/app/report/list,Symfony 抛出一个拒绝访问错误。日志说

调试 - 访问被拒绝,用户既不是匿名用户,也不是记住我。 如果我访问 app_dev.php/admin/app/report/list 它可以工作!

所以我尝试从

更改处理程序
sonata.admin.security.handler.acl
sonata.admin.security.handler.roles

之所以有效,是因为我可以在管理仪表板中看到该块。我也尝试过改变

access_decision_manager:
        策略:一致
肯定
但它不起作用......

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

【问题讨论】:

  • 是的,同样的问题,我正在研究它。当我解决了它,我会给你一个解决方案:)
  • 您是否从研究中获得了新信息?我完全被这个困住了......
  • 我对此做了一些调整并得到了一些功能,我会在剩下几分钟的时候写一个答案:)

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


【解决方案1】:

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

首先,在我的 app/config/ 中的“sonata.yml”中,我更改了如下所示的权限:

app/config/sonata.yml

sonata_admin:
    security:
        handler: sonata.admin.security.handler.acl

        # acl security information
        information:
            # GUEST:    [VIEW, LIST]
            # STAFF:    [EDIT, LIST, CREATE]
            # EDITOR:   [OPERATOR, EXPORT]
            # ADMIN:    [MASTER]
            EDIT: EDIT
            LIST: LIST
            CREATE: CREATE
            VIEW: VIEW
            DELETE: DELETE
            EXPORT: EXPORT
            MASTER: MASTER

为了避免这种情况...

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

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

app/config/security.yml

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

请注意,我的应用仅围绕管理仪表板构建,因此每个用户在创建时都需要拥有仪表板访问权限。 这样,我已经像这样修改了我的 User 构造函数:

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

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;
    }
}

编辑:看来我在不知不觉中回复了你的另一个问题^^" (How can I assign default role to user in Symfony2)

现在每个用户都可以访问仪表板,但就像您的问题一样,他们什么也看不到。

我需要使用 ACL,但与角色一样,我的用户属于拥有自己 ACL 的组。

一旦我的用户属于一个或多个组,除了他自己的权限外,他还获得了组权限。

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

例如:

                        ┌─────────────┐
                        │   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   │
                                                        └───────────────┘

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

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

【讨论】:

    【解决方案2】:

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

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

    查看我对AclVoter denies access to 'LIST'的回复

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 2018-05-19
      • 1970-01-01
      • 2018-06-12
      • 2015-02-08
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 2012-12-08
      相关资源
      最近更新 更多