我正在做一个Sonata项目,我使用Doctrine管理我的数据库,用FOSbundle登录我的用户。我试图给我的用户不同的权利。我有一个名为Suivi的实体,这是我当前Suivi列表菜单的屏幕截图。正如您在右侧看到的那样,有不同的按钮(显示,编辑,删除):
我想隐藏编辑和删除按钮给某个用户,这样只需给他们读取权限。
所以我在我的security.yml中创建了一个ROLE_SONATA_SUIVI_READER,灵感来自这个链接:
/app/config/security.yml
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
role_hierarchy:
ROLE_SONATA_SUIVI_READER:
- ROLE_SONATA_ADMIN_DEMO_SUIVI_LIST
- ROLE_SONATA_ADMIN_DEMO_SUIVI_VIEW
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
ROLE_DEFAULT: ROLE_SONATA_SUIVI_READER
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
firewalls:
console:
pattern: ^/_console
anonymous: false
security: true
logout: true
http_basic: ~
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
default_target_path: /admin/dashboard
logout:
path: fos_user_security_logout
target: fos_user_security_login
anonymous: true
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_DEFAULT }
/src/AppBundle/Admin/SuiviAdmin.yml
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->add('phylica', null, array('associated_property' => 'numeroPlant'))
->add('phenologie','text',array('label'=>'Phénologie'))
->add('traitement','text',array('label'=>'Traitement'))
->add('competition','text',array('label'=>'Compétition'))
->add('predation','text',array('label'=>'Prédation'))
->add('periode','text',array('label'=>'Période'))
->add('saison')
->add('hauteurMaximumCm','text',array('label'=>'Hauteur Max(cm)'))
->add('dbhB','text',array('label'=>'dbh b'))
->add('dbhH','text',array('label'=>'dbh h'))
->add('mort','text',array('label'=>'Mort'))
->add('nonTrouve','text',array('label'=>'Non trouvé'))
->add('_action', null, array(
'actions' => array(
'show' => array(),
'edit' => array(),
'delete' => array(),
)
));
}
这是我在config中的fos_user设置:
/app/config/config.yml
fos_user:
db_driver: orm
firewall_name: main
user_class: AppBundle\Entity\User
registration:
form:
type: AppBundle\Form\RegistrationFormType
group:
group_class: AppBundle\Entity\Group
service:
mailer: fos_user.mailer.default
from_email:
address: "%mailer_user%"
sender_name: "%mailer_user%"
resetting:
email:
from_email:
address: toto@gmail.com
sender_name: Demo Resetting
根据symfony的文档(https://symfony.com/doc/3.4/security.html),我认为我可以在twig文件中做这样的事情:
{% if is_granted('ROLE_ADMIN') %}
<p>DISPLAY SOMETHING</p>
{% endif %}
但是这个解决方案并不能让我满意,这不是FOSbundle做事的方式,而且我不想直接使用Sonata twig文件。 如果有人有解决方案......提前致谢。