草庐IT

php - 交响乐框架;存储用户角色的惯用方式

coder 2024-01-01 原文

在我的 Symfony 2 应用程序中,我想使用用户和角色的标准授权系统 (http://symfony.com/doc/2.0/book/security.html)

我的用户是一个存储在数据库中的实体,具有原则(实现用户界面)。我的系统中将有 5 个预定义角色,每个用户可能有多个这样的角色。

最惯用的实现方式是什么?我想到了以下三种解决方案。

  1. 创建一个单独的角色实体,并与用户实体建立多对多关系

    • 另外:轻松获得具有特定角色的所有用户
    • 缺点:资源密集型? (总是需要双连接来获取用户的所有角色)
    • 反对意见:不习惯?角色的数量(及其名称)永远不会改变,那么将其作为单独的实体存储在数据库中有意义吗?
  2. 在用户中有一个字段,它是一个排序的、逗号分隔的角色列表,getRoles() 实现为 explode(',',this.all_roles)

    • 另外:计算成本不高
    • 缺点:很难让所有用户都担任特定角色
    • 缺点:像这样的数据库字段让小猫哭泣(规范化和其他东西)
  3. 在每个角色的用户实体中有 5 个二进制字段

    • 另外:计算成本不高
    • 另外:轻松获得具有特定角色的所有用户
    • 缺点:这仍然感觉不太好

实现这个系统最惯用的方法是什么?

最佳答案

当然,答案很大程度上取决于您的要求,但我会尽量在全局范围内回答。

选项 1:关系方式

从纯关系的角度来看,您希望您的数据库规范化,这将导致您的第一个选择:角色表与您的用户表具有 m:n 关系。这有一些优点:

  • 好吧,这是人们期望您的数据库工作的方式,因此您的实体中没有隐藏的功能。
  • 没有办法把事情搞砸(比如当你有一个 varchar 字段并期望它有某种格式,比如逗号分隔)
  • 做事只有一种方式

关于您对角色永远不会改变的担忧:存储关系数据与它改变的频率无关。人们应该永远记住需求会发生变化。你现在以优化的名义搞得越多,以后当需要更多更频繁变化的角色时你就越挣扎。

当然,您可能会遇到性能问题,特别是如果您遇到某种急切加载问题,或者如果您没有缓存内容并且必须在每次页面加载时重新加载角色。但是,关系数据库旨在支持此类内容,因此这里应该有优化查询的方法。

选项 2:黑客攻击

您的第二个选项,将所有角色简单地存储到一个 varchar 中,在性能方面会好得多。只需加载一个文本字段,进行一些 PHP 处理,您就完成了。另一方面,您可能会遇到几个问题:

  • 您无法控制 varchar 字段,因此一个故障脚本可能会危及您的整个应用程序(这真的很糟糕,但根据您的项目,如果您是唯一的开发人员并且您知道自己在做什么,它可能会好)
  • 更新一个数据集要困难得多,因为您必须提取所有角色,更新有问题的角色,然后存储回去
  • 查询具有特定角色的所有用户要困难得多
  • 删除角色要困难得多

选项 3:务实的解决方案

中间是每个角色有 5 个 bool 值的第三个选项:没有办法把它搞砸,性能应该不是问题。更新以及删除角色或添加新角色都很容易。很清楚这些字段的作用,所以这边也没有坏处。它使您的实体和数据库看起来有点丑陋,并且您在用户模型中也会有角色名称,以及将 true/false 字段映射到正确的角色名称,这可能有点困惑。

结果

记住这一切,我会选择选项 1。有人可能会认为性能是一个问题,但除非我能证明这一点,否则我不会考虑这些事情。最后,当你真的遇到真正的性能问题时,你会怎么做?您可以添加一些额外的硬件、优化您的 dbms、优化查询或者使用内置更高性能的 dbms(Hello Oracle!)。

如果您已经证明您的应用程序由于角色表而变慢,您以后总是可以使用选项 3。您只需要更改您的用户实体并使用一个查询来提取角色并为每个用户设置正确的 true/false 组合。如果软件是干净的,这是几个小时的问题,所以没有必要现在就做,因为性能可能很差。

关于php - 交响乐框架;存储用户角色的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9583386/

有关php - 交响乐框架;存储用户角色的惯用方式的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  4. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  5. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  6. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  7. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  8. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  9. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  10. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

随机推荐