在我的Symfony2项目中,我设法按照官方文档设置了FOSUserBundle + SonataUserBundle + SonataAdminBundle。现在是时候设置ACL(访问控制列表)了。
我做了什么:
创建了一个名为AdminReport
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"]
包含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,但它不起作用...
我肯定错过了什么但在哪里?
答案 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
的回答