ACL + SonataAdminBundle + SonataUserBundle



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

我做了什么:

  • 创建了一个名为AdminReport 的AdminClass

  • app/console sonata:admin:setup acl

    安装sona.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:生成对象acl
    • 与此用户一起登录并访问默认/admin/仪表板

    应该显示包含AdminReport的块,但它不是。。。我错过了什么?

这是我的配置yml

sona_admin:安全性:处理程序:sonata.admin.security.handler.acl信息:来宾:[查看,列表]职员:[编辑,列出,创建]编辑器:[操作符,导出]ADMIN:[MASTER]admin_permissions:[CREATE、LIST、DELETE、UNDELETE、EXPORT、OPERATOR、MASTER]对象权限:[VIEW、EDIT、DELETE、UNDELETE、OPERATOR、MASTER、OWNER]

编辑我试图用这个用户直接访问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_delection_manager:策略:一致
肯定
,但它不起作用。。。

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

好吧,经过一些调整,我实现了使其工作。

首先,在app/config/中的">奏鸣曲.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

为了避免这种情况。。。

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

我已经评论了以下内容,因为我认为防火墙投票者阻止了对我的用户的访问。也许不是更明智的解决方案,但目前运行良好:(

app/config/security.yml

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

请注意,我的应用程序只是围绕管理dahboard构建的,因此每个用户在创建时都需要拥有仪表板访问权限。通过这种方式,我修改了我的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;
    }
}

编辑:我似乎在不知情的情况下回答了您的另一个问题^^"(我如何在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:如果有人看到任何错误或任何不合逻辑的东西,请毫不犹豫地在评论中告诉我,我仍在学习使用它,这将很有帮助:(

SonataAdminBundle的PermissionMap扩展了Symfony的BasicPermissionMap。只有当您更改此默认配置时,AclVoter才支持属性"LIST"one_answers"EXPORT",并且可以投票授予所需的权限。
parameters:
    security.acl.permission.map.class: SonataAdminBundleSecurityAclPermissionAdminPermissionMap

请参阅我对AclVoter拒绝访问';列表';

相关内容

  • 没有找到相关文章

最新更新