AclVoter 拒绝访问 'LIST'
AclVoter denies access to 'LIST'
一旦我将 sonata_admin.security.handler
设置为 sonata.admin.security.handler.acl
,唯一有权访问的用户就是具有 ROLE_SUPER_ADMIN 的用户。
我认为我配置一切正确,显然不是。
我试过了:
- 给用户真正的角色
ROLE_VIP_CONTACT_ADMIN
而不是通过 fos_group 分配,没有成功。
- 所有选项
security.access_decision_manager.strategy
:肯定、一致和一致
- 删除所有acl表,acl:init,sonata:admin:setup-acl,有无sonata:admin:generate-object-acl,每次都清除缓存。
没有成功。
# Acme\MyBundle\Controller\CRUDController.php
$securityContext->getAdminPermissions();
# -> ["CREATE", "LIST", "DELETE", "UNDELETE", "EXPORT", "OPERATOR", "MASTER"]
dump($this->admin->getSecurityInformation());
/* -> array:3 [▼
"GUEST" => array:2 [▼
0 => "VIEW"
1 => "LIST"
]
"STAFF" => array:3 [▼
0 => "EDIT"
1 => "LIST"
2 => "CREATE"
]
"ADMIN" => array:3 [▼
0 => "MASTER"
1 => "OPERATOR"
2 => "EXPORT"
]
] */
dump($this->getUser()->getRoles());
/* -> array:15 [▼
0 => "ROLE_ADMIN"
1 => "ROLE_VIP_CONTACT_GUEST"
2 => "ROLE_VIP_CONTACT_STAFF"
3 => "ROLE_VIP_CONTACT_ADMIN" # <--- I gave him everything!
[...]
9 => "ROLE_ALLOWED_TO_SWITCH"
[...]
16 => "ROLE_USER"
] */
现在我打开浏览器并转到 app_dev.php/my-path-to/vip/contact/list
,导致 AccessDeniedException。
/edit: 这和这里的问题是一样的 ACL + SonataAdminBundle + SonataUserBundle.
经过几个小时的调试,结果是通过Sonata 的AdminPermissionMap 让ACL 知道LIST
权限。
参见 SonataAdminBundle 5. Security and Documentation » Admin(Ctrl+F:security.acl.permission.map.class)
parameters:
security.acl.permission.map.class: Sonata\AdminBundle\Security\Acl\Permission\AdminPermissionMap
你可能已经知道了。
长话短说:配置不仅是通过编写一些配置文件来完成的,而且还需要导入正确的配置文件。
在 Symphony >3.1 上你应该使用这个:
services:
security.acl.permission.map:
class: Sonata\AdminBundle\Security\Acl\Permission\AdminPermissionMap
改为
parameters:
security.acl.permission.map.class: Sonata\AdminBundle\Security\Acl\Permission\AdminPermissionMap
一旦我将 sonata_admin.security.handler
设置为 sonata.admin.security.handler.acl
,唯一有权访问的用户就是具有 ROLE_SUPER_ADMIN 的用户。
我认为我配置一切正确,显然不是。
我试过了:
- 给用户真正的角色
ROLE_VIP_CONTACT_ADMIN
而不是通过 fos_group 分配,没有成功。 - 所有选项
security.access_decision_manager.strategy
:肯定、一致和一致 - 删除所有acl表,acl:init,sonata:admin:setup-acl,有无sonata:admin:generate-object-acl,每次都清除缓存。
没有成功。
# Acme\MyBundle\Controller\CRUDController.php
$securityContext->getAdminPermissions();
# -> ["CREATE", "LIST", "DELETE", "UNDELETE", "EXPORT", "OPERATOR", "MASTER"]
dump($this->admin->getSecurityInformation());
/* -> array:3 [▼
"GUEST" => array:2 [▼
0 => "VIEW"
1 => "LIST"
]
"STAFF" => array:3 [▼
0 => "EDIT"
1 => "LIST"
2 => "CREATE"
]
"ADMIN" => array:3 [▼
0 => "MASTER"
1 => "OPERATOR"
2 => "EXPORT"
]
] */
dump($this->getUser()->getRoles());
/* -> array:15 [▼
0 => "ROLE_ADMIN"
1 => "ROLE_VIP_CONTACT_GUEST"
2 => "ROLE_VIP_CONTACT_STAFF"
3 => "ROLE_VIP_CONTACT_ADMIN" # <--- I gave him everything!
[...]
9 => "ROLE_ALLOWED_TO_SWITCH"
[...]
16 => "ROLE_USER"
] */
现在我打开浏览器并转到 app_dev.php/my-path-to/vip/contact/list
,导致 AccessDeniedException。
/edit: 这和这里的问题是一样的 ACL + SonataAdminBundle + SonataUserBundle.
经过几个小时的调试,结果是通过Sonata 的AdminPermissionMap 让ACL 知道LIST
权限。
参见 SonataAdminBundle 5. Security and Documentation » Admin(Ctrl+F:security.acl.permission.map.class)
parameters:
security.acl.permission.map.class: Sonata\AdminBundle\Security\Acl\Permission\AdminPermissionMap
你可能已经知道了。
长话短说:配置不仅是通过编写一些配置文件来完成的,而且还需要导入正确的配置文件。
在 Symphony >3.1 上你应该使用这个:
services:
security.acl.permission.map:
class: Sonata\AdminBundle\Security\Acl\Permission\AdminPermissionMap
改为
parameters: security.acl.permission.map.class: Sonata\AdminBundle\Security\Acl\Permission\AdminPermissionMap