管理 FOSUserBundle 中的用户/角色/组

2023-11-25

我正在开发一个简单的 CRUD 来管理我正在使用的应用程序的用户/角色/组。管理我正在使用的用户FOSUserBundle。我想做的事情可以通过以下几种方式来完成:

  • 将角色分配给组,然后将用户分配给这些组
  • 直接为用户分配角色

但我不知道怎么办。我知道 FOSUserBaseUser类已经有一列roles并在文档FOSUser 的解释了如何建立ManyToMany用户和组之间的关系,但不谈论角色。我想到的唯一想法是创建一个实体来管理角色以及用于相同目的的表单,如下所示:

角色实体

use Symfony\Component\Security\Core\Role\RoleInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="fos_role")
 * @ORM\Entity(repositoryClass="UserBundle\Entity\Repository\RoleRepository")
 * 
 * @see User
 * @see \UserBundle\Role\RoleHierarchy
 * 
 */
class Role implements RoleInterface
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id()
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(name="name", type="string", length=80, unique=true)
     */
    private $name;

    /**
     * @ORM\ManyToOne(targetEntity="Role", inversedBy="children")
     * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", nullable=true)
     * @var Role[]
     */
    private $parent;

    /**
     * @ORM\OneToMany(targetEntity="Role", mappedBy="parent")
     * @var ArrayCollection|Role[]
     */
    private $children;

    /**
     * @ORM\ManyToMany(targetEntity="User", mappedBy="roles")
     */
    private $users;

    public function __construct($role = "")
    {
        if (0 !== strlen($role)) {
            $this->name = strtoupper($role);
        }

        $this->users = new ArrayCollection();
        $this->children = new ArrayCollection();
    }

    /**
     * @see RoleInterface
     */
    public function getRole()
    {
        return $this->name;
    }

    public function getId()
    {
        return $this->id;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getUsers()
    {
        return $this->users;
    }

    public function addUser($user, $addRoleToUser = true)
    {
        $this->users->add($user);
        $addRoleToUser && $user->addRole($this, false);
    }

    public function removeUser($user)
    {
        $this->users->removeElement($user);
    }

    public function getChildren()
    {
        return $this->children;
    }

    public function addChildren(Role $child, $setParentToChild = true)
    {
        $this->children->add($child);
        $setParentToChild && $child->setParent($this, false);
    }

    public function getDescendant(& $descendants = array())
    {
        foreach ($this->children as $role) {
            $descendants[spl_object_hash($role)] = $role;
            $role->getDescendant($descendants);
        }
        return $descendants;
    }

    public function removeChildren(Role $children)
    {
        $this->children->removeElement($children);
    }

    public function getParent()
    {
        return $this->parent;
    }

    public function setParent(Role $parent, $addChildToParent = true)
    {
        $addChildToParent && $parent->addChildren($this, false);
        $this->parent = $parent;
    }

    public function __toString()
    {
        if ($this->children->count()) {
            $childNameList = array();
            foreach ($this->children as $child) {
                $childNameList[] = $child->getName();
            }
            return sprintf('%s [%s]', $this->name, implode(', ', $childNameList));
        }
        return sprintf('%s', $this->name);
    }
}

角色表单类型

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class RoleType extends AbstractType {

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
                ->add('name')
                ->add('parent');
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Tanane\UserBundle\Entity\Role'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'role';
    }    
}

如果是这样,添加到我的用户表单中的内容将如下所示

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
            ->add('username', 'text')
            ->add('email', 'email')
            ->add('enabled', null, array(
                'label' => 'Habilitado',
                'required' => false
            ))
            ->add('rolesCollection', 'entity', array(
                'class' => 'UserBundle:Role',
                'multiple' => true,
                'expanded' => true,
                'attr' => array('class' => 'single-line-checks')
            ))
            ->add('groups', 'entity', array(
                'class' => 'UserBundle:Group',
                'multiple' => true,
                'expanded' => true,
    ));
}

但我不知道这是否是处理角色的正确方法,因为在这种情况下将在我的数据库中创建一个名为的新表fos_roles用户/角色之间的关系在哪里处理,但组/角色之间的关系不参与其中,那么这就是我有点迷失的地方,需要更有经验的人的帮助,告诉我并提醒我是否走上正轨,并且这将使他们实现我在前两点中解释的目标。有什么建议或帮助吗?你如何处理这个问题?


Symfony 角色

FOSUserBundle 处理角色的方式是将它们存储在roles您所看到的列,采用如下序列化格式:a:1:{i:0;s:10:"ROLE_ADMIN";}。因此不需要任何其他表或实体^。

^ 这与组相反,组需要显式配置,由单独的表/实体表示,并且确实涉及将用户与数据库中的组相关联。组允许您定义任意角色集合,然后可以将其作为离散包提供给每个用户。

用户可以是任意数量的角色的成员。它们由以“ROLE_”开头的字符串标识,您可以开始使用新角色。

角色对您的应用程序意味着什么完全取决于您,但它们是一个相当高级的工具 - 用户要么处于特定角色,要么不处于特定角色。

您可以通过以下方式将人员分配到角色中:Symfony 控制台:

php app/console fos:user:promote testuser ROLE_ADMIN

或者在 PHP 中:

$user = $this->getUser();
$userManager = $container->get('fos_user.user_manager');
$user->addRole('ROLE_ADMIN');
$userManager->updateUser($user);

您可以在 PHP 中测试成员资格:

$user = $this->getUser();
if ($user->hasRole('ROLE_ADMIN'))
{
    //do something
}

或者使用注释:

/**
 * @Security("has_role('ROLE_ADMIN')")
 */
 public function adminAction()
 {
     //...

or

/**
 * @Security("has_role('ROLE_ADMIN')")
 */
class AdminController
{
    //...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

管理 FOSUserBundle 中的用户/角色/组 的相关文章

  • 为什么这评估为 true

    为什么这评估结果为真
  • 点击 %40 变为 %2540

    当单击包含 符号的链接时 该网址给我 40 这就是我想要的 但是一旦我点击它 一秒钟后它就在我点击后变成了 2540 单击是在电子邮件内 然后定向到网站 其中 40 更改为 2540 我怎样才能让它停止变化 它现在得到这样的参数 email
  • if/else 简写来定义变量

    我很难理解 if else 的 php 简写是如何描述的here https stackoverflow com questions 20233207 php if shorthand and echo in one line possib
  • Symfony2 条件服务声明

    我目前正在尝试找到一个可靠的解决方案来动态更改 Symfony2 服务的依赖关系 详细信息 我有一个服务 它使用 HTTP 驱动程序与外部 API 进行通信 class myAwesomeService private httpDriver
  • 如何将变量插入 PHP 数组?

    我在网上查了一些答案 但都不是很准确 我希望能够做到这一点 id result id info array id Example echo info 0 这有可能吗 您需要的是 不推荐 info array id Example varia
  • Smarty 如果 URL 包含

    使用 Smarty 标签我想确定 URL 是否包含单词 例如 if smarty get page contains product php 我知道 contains 不存在 但是我怎样才能轻松地编写类似的东西来实现上述代码呢 所有 PHP
  • 选择一组数字以达到最小总数的算法

    给定 一组数字n 1 n 2 n 3 n x 还有一个数字M 我想找到最好的组合 n a n b n c n gt M 该组合应达到达到或超过 M 所需的最小值 没有其他组合可以提供更好的结果 将在 PHP 中执行此操作 因此可以使用 PH
  • php源代码到PO文件生成器

    我必须将我的所有回显 打印字符串转换为PHP源代码代码文件到PO file 为了语言翻译 有批次吗对流器可用于相同的 我如何做到这一点 make gettext在您的服务器上运行 setup a 翻译适配器 例如带有 gettext 适配器
  • 媒体的 Google Cloud Storage 签名网址

    我已经建立了一个视频网站 为用户提供 m3u8 和关联的 ts 文件 我不希望媒体文件免费可用 所以我所做的是 当用户在网站上时 在 mysql 中使用他们的 IP 和令牌创建一个会话 当他们请求特定媒体子域 mp4 domain com
  • CodeIgniter 控制器 - JSON - AJAX

    我正在尝试通过 AJAX 使用 CodeIgniter 发送表单构建 并尝试使用 JSON 获取响应 但是 我只在打开开发人员选项卡时看到响应 我什至不确定这是否实际上是响应 因为它显示了两个 json 数据 它所显示的只是加载旋转器 然后
  • 使用 PHP Selenium Webdriver 单击下拉菜单中的选项?

    我正在使用 PHP Selenium Webdriver 包装器Facebook https github com facebook php webdriver 任何人都可以给我一个如何单击或从选择下拉菜单中选择选项的示例吗 我已经尝试过这
  • 从类似 cronjob 的语法创建“下次运行时间”日期

    在我正在创建的应用程序中 用户可以安排重复任务 生成间隔模式的简单值是 Minute 0 59 90 each minute Hour 0 23 90 each hour Day of month 1 31 90 each day of m
  • Google Cloud SQL 上的故障转移如何运作?

    我打算将 PHP 应用程序 从 Google Cloud Platform 外部的服务器 连接到 Google Cloud SQL 我想知道如何设计应用程序以正确地对其数据库进行故障转移 根据manual https cloud googl
  • WordPress 包含 SVG 文件错误

    我使用 PHP 和 WordPress 在本地主机上 我可以毫无问题地包含 SVG 文件 但在实时服务器上 我尝试包含一个 SVG 文件以便能够使用 CSS 对其进行样式设置 我收到此错误消息 Parse error syntax erro
  • 使用 Instagram Basic Display API 时出现“无效平台应用程序”错误

    我正在尝试使用 Instagram Basic 显示 API 但是当我发布授权代码以获取访问令牌时 我不断收到以下错误 error type OAuthException 代码 400 error message 平台应用无效 我正在遵循此
  • 在 WooCommerce 中添加到购物车之前清空购物车

    我正在使用 WP 作业管理器和 Woo Subscriptions Now 最初 我选择了一个套餐 Woo Subscription 然后我添加了所有细节 但没有提交 回到网站 所以要再次购买 我需要选择一个套餐 于是我选择了套餐并填写了详
  • Facebook PHP SDK - 如何获取访问令牌?

    我正在尝试从我的应用程序在用户的 Facebook 墙上发帖 用户授予应用程序在他的墙上发布的权限 并且我在数据库中有用户ID 我需要自动发送帖子 而无需用户再次登录 我的代码是 try require once dirname FILE
  • PHP 中的引用

    我正在编写一个自定义博客引擎 并且希望拥有类似于 Wordpress 的引用 我可以查看 WordPress 源代码 但我真的更喜欢某种教程 但到目前为止我还没有找到 有没有关于在 PHP5 中实现 trackbacks 或 pingbac
  • 如何在 phalcon 框架中同时连接多个数据库在模型类中同时使用两个而不仅仅是一个

    在我的代码中我有两个数据库ABC and XYZ 我想在同一模型中使用两个数据库 而不是 phalcon 中的解决方案是什么 如何为此实现多个数据库连接 one
  • 从字符串中获取数字

    我有一个字符串 例如 lorem 110 ipusm 我想获取 110 我已经尝试过这个 preg match all 0 9 string ret 但这正在返回 Array 0 gt 1 1 gt 1 2 gt 0 我想要这样的东西 Ar

随机推荐

  • 将 CSV 转换为 XLS

    我正在一个以块分隔的 Web 应用程序中工作 我从我的同事那里获取了一个 CSV 对象 我必须将其转换为 XLS 才能传递到他们构建的 Excel 处理器中 该 CSV 对象由字符 分隔 我想知道如何以编程方式将 CSV 对象转换为 XLS
  • UIScrollView 具有粘性页脚 UIView 和动态高度内容

    挑战时间 假设我们有 2 个内容视图 具有动态高度内容的 UIView 可扩展 UITextView RED UIView 作为页脚 蓝色 此内容位于 UIScrollView GEEN 内 我应该如何构建和处理自动布局的约束以归档以下所有
  • 逗号表达式的左侧操作数无效

    for count index packet no 0 count lt TOTAL OBJ packet no lt TOTAL PKT count packet no gt 逗号表达式的左侧操作数无效 我发现上面的代码是正确的 但不明白
  • Windows 批处理文件获取 C:\ 驱动器总空间和可用空间

    我需要一个 bat 文件来获取 Windows 系统中的 C 驱动器总空间和可用空间 以 GB 千兆字节 为单位 并创建一个包含详细信息的文本文件 注意 我不想使用任何外部实用程序 将大小的 9 位数字按字节截取 得到大小 以 GB 为单位
  • MSIL 调试器 - Mdbg、Dbgclr、Cordbg

    我一直在做一些 MSIL 工作 并且遇到过对这三个调试器的引用 他们之间有什么区别 其中之一比其他人更好吗 功能 还有其他我错过的吗 我假设您的意思是 DbgClr 而不是 Clt mdbg 而不是 mdbug DbgClr 使用 VS s
  • 如何在 Sublime Text 中向语法定义添加功能而不进行编辑?

    例如 我想强调 param type and return 即 epytext 声明 在我的 Python 文档字符串中 我已经想出了如何通过简单的编辑来做到这一点Python Python tmLanguage 但是 出于以下几个原因 我
  • 使用 willTransitionToState 在 uitableviewcell 中对文本标签进行动画处理

    当我按下编辑按钮时 我试图为 UItableviewcell 中的文本标签设置动画 我正在尝试让它淡出和淡入 淡入有效 但当我按 编辑 时 文本标签消失 当我按 完成 时 我完美地淡入 谁能告诉我为什么它不起作用 提前致谢 void wil
  • 以范围为键的字典

    在 Python 中 如何将一系列值映射到一个具体值 基本上 我想要一本字典 我可以用数字填充范围和索引 rd rangedict rd 0 10 5 print rd 4 prints 5 print rd 6 prints 5 rd 5
  • WordPress - 生成按标签和类别过滤的帖子列表

    我正在尝试创建一个页面上有六个列表的 WordPress 网站 每个列表显示来自不同类别的帖子 简单的 但是 如果用户选择一个标签 将他们带到该标签存档页面 我希望他们仍然看到六列表模板 但每个类别中的所有帖子也会按标签过滤 因此 帖子列表
  • 如何在根节点查找子节点[TreeView]

    ROOT A B C D E T F G X 我想找到E节点的父节点 它是5号 然后 我将保存节点 如果数字较小5 我在Asp net控件中使用TreeView 我建议使用递归迭代 private TreeNode FindNode Tre
  • R:stat_smooth 组(x 轴)

    我有一个Database 并想使用 stat smooth 显示图形 我可以显示 avg time 与 Scored Probabilities 的对比图 如下所示 c lt ggplot dataset1 aes x Avg time y
  • 如何更改 ggplot2 geom_raster 中的插值/平滑

    是否可以改变插值级别 例如平滑 模糊 geom raster library tidyverse mtcars gt group by carb hp cut mtcars hp 3 labels c low med hi gt summa
  • 调整多维向量的大小

    如何调整多维向量的大小 例如 vector
  • Spring Security - 无法避免缓存控制

    我有一个应用程序 并使用 spring 的控制器映射将图像加载给我的用户 输入流 响应等 在我的控制器中 我将标头设置为缓存控制 基于文件等 但所有请求中总是有 pragma no cache 和 Cache Control max age
  • 如何在 F# 中声明通用异常类型

    如何定义如下所示的异常 exception CustomExn lt TMessage gt of TMessage list 也许你可以直接继承System Exception type CustomExn lt TMessage gt
  • 按下蓝牙设备按钮应触发应用程序中的 Onclick 侦听器

    我正在尝试制作一个应用程序 当在配对的蓝牙设备上按下按钮时 该应用程序会触发应用程序中的单击侦听器 经过几个小时的谷歌搜索后 我认为我无法将蓝牙设备按钮的键码发送到广播接收器 如果键码匹配 那么我可以调用点击监听器 或者我的方法和理解可能是
  • wpf databind IsVisible to TabControl.SelectedItem != null

    我有一个StackPanel我想让它仅在以下情况下可见SomeTabControl SelectedItem null 如何在 WPF 绑定中执行此操作 您可以通过使用样式和触发器而无需转换器来完成此操作
  • 如何使用delphi以编程方式删除USB闪存盘?

    如何使用delphi以编程方式检测和删除USB闪存盘 我已经看过该网站上的一些示例 但它们缺乏关于如何进行操作的明确解释 请举例真的很有帮助 这是一个快速而肮脏的翻译这个示例代码要删除驱动器 请访问 support microsoft co
  • jQuery - 无法将事件绑定到动态元素?

    我来维护一段 javascript 它从服务器下载一些 JSON 数据 构建一个新的表行 例如 tr 然后 将事件绑定到它 如下所示 a click function yadda yadda return false 唯一的问题是这似乎不起
  • 管理 FOSUserBundle 中的用户/角色/组

    我正在开发一个简单的 CRUD 来管理我正在使用的应用程序的用户 角色 组 管理我正在使用的用户FOSUserBundle 我想做的事情可以通过以下几种方式来完成 将角色分配给组 然后将用户分配给这些组 直接为用户分配角色 但我不知道怎么办