12

好的,我正在尝试检查用户是否具有特定角色,我这样做

但是,当我这样做时:

public function buildForm(FormBuilder $builder, array $options)
{
    $builder
        ->add('nombre',null,array('label' => 'Usuario'))
        ->add('email')
        ->add('password', 'repeated', array(
            'type' => 'password',
            'invalid_message' => 'Los campos deben coincidir',
            'first_name' => 'password',
            'second_name' => 'confirmar password',
            'options' => array('required' => false)
            ))

        ->add('cliente', 'entity', array(
        'class' => 'ClientesBundle:Cliente',
        'empty_value' => 'Company',            
        'required'    => false,
        'empty_data'  => null)
    **)**
      $user = $this->securityContext->getToken()->getUser();
      **if ($user->getRol() == 'ROLE_SUPER_ADMIN'){**
        ->add('rol') 
        **}**
    ;

}

也试过这个:

 **if ($this->securityContext->getToken()->getUser()->getRol() === 'ROLE_SUPER_ADMIN'){**
            ->add('rol') 
            **}**

粗体线(带有 ** 的线)有一条小红线,表示错误,如果... 我该如何解决?

4

4 回答 4

16

从控制器您必须将用户对象传递给表单构建器

$form = $this->createForm(
    new YourType(), 
    $data, 
    array('user' => $this->getUser())
);

然后在表单生成器中,您可以从以下位置获取它$options

public function buildForm(FormBuilder $builder, array $options)
{
    $user = $options['user']
}

不要忘记setDefaultOptions()使用user索引进行扩展:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        ...
        'user' => null
    ));
}
于 2013-01-29T15:13:00.713 回答
15

如果将表单类型声明为服务,则可以在类中注入令牌存储。

所以你services.yml像这样声明服务:

my_form:
    class: AppBundle\Services\MyFormType
    public: true
    arguments:  ['@security.token_storage']

和这样的表单类:

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;

class MyFormType extends AbstractType
{
    protected $tokenStorage;

    public function __construct(TokenStorage $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $user = $this->tokenStorage->getToken()->getUser();
        // Use the user object to build the form
    }
}
于 2017-10-05T23:16:12.073 回答
8

我知道这是一个老问题,但我想提出一个更好的替代方法来检查表单类型中的角色。

问题

使用 TokenInterface 和 User 对象的问题是它不检查继承。例如,考虑以下内容security.yml

security:
    role_hierarchy:
        ROLE_ADMIN: ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

如果您的用户已添加ROLE_SUPER_ADMIN但未添加到他们的角色,如果您使用ROLE_ADMIN上述解决方案将失败$user->hasRole('ROLE_ADMIN'),因为用户没有明确ROLE_ADMIN分配给他们的用户并且hasRole()没有检查层次结构。


解决方案

使用AuthorizationCheckerInterface代替来访问该isGranted()功能。

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;

class MyFormType extends AbstractType {

    protected $auth;

    public function __construct(AuthorizationCheckerInterface $auth) {
        $this->auth = $auth;
    }

    public function buildForm(FormBuilderInterface $builder, array $options) {

        // ...

        if($this->auth->isGranted('ROLE_ADMIN')) {
            // Do the thing here
        }
    }
}

这将尊重security.yml. 如果我们使用与上面相同的 yml 文件,如果用户已分配但未分配到他们的个人资料,$auth->isGranted('ROLE_ADMIN')则将返回true 。ROLE_SUPER_ADMINROLE_ADMIN

于 2018-12-31T02:19:18.620 回答
1

我成功地完成了这件事而没有传递到 symfony 3.4 中的服务。我知道我的方法不是最“专业”的,但它很简单而且很有效。

首先,从您的控制器以您的 formType 发送用户

$form = $this->get('form.factory')->create(addPlanExpectedType::class, $business,
            array('user' => $this->getUser())
        );

其次,恢复角色,并验证“ROLE_AMIN”是否在这个 $roles 数组中

public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $businessId = $options['data']->getId();

        $user = $options['user'];
        $roles = $user->getRoles();

        $boolAdmin = in_array('ROLE_ADMIN', $roles);
于 2020-04-08T10:03:49.457 回答