在我的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:如果有人看到任何错误或任何不合逻辑的东西,请毫不犹豫地在评论中告诉我,我仍在学习使用它,这将很有帮助:(
parameters:
security.acl.permission.map.class: SonataAdminBundleSecurityAclPermissionAdminPermissionMap
请参阅我对AclVoter拒绝访问';列表';