Pet*_*mit 8 php authorization idiomatic symfony doctrine-orm
在我的Symfony 2应用程序中,我想使用标准的用户和角色授权系统(http://symfony.com/doc/2.0/book/security.html)
我的用户是存储在具有doctrine(实现用户界面)的数据库中的实体.我将在我的系统中有5个预定义角色,每个用户可能有多个这些角色.
实现这一目标的最惯用方法是什么?我在考虑以下三种解决方案.
创建单独的Role实体并与用户实体创建多对多关系
在用户中有一个字段,它是一个排序的逗号分隔的角色列表,getRoles()实现为 explode(',',this.all_roles)
每个角色的用户实体中有5个二进制字段
实现这个系统最常用的方法是什么?
Sgo*_*kes 12
当然,答案很大程度上取决于您的要求,但我会尝试尽可能全面地回答.
选项1:关系方式
从纯粹的关系角度来看,您希望数据库规范化,这将导致您的第一个选项:与您的用户表具有am:n关系的角色的表.这有一些优点:
关于角色永远不会改变的关注:存储数据关系不是关于它变化的频率.人们应该永远记住要求的变化.你现在以优化的名义陷入困境越多,当你需要更多经常变化的角色时,你就会越努力.
当然,您可能会遇到性能问题,尤其是遇到某种急切加载问题或者您没有缓存内容并且必须在每个页面加载时重新加载角色时.但是,关系数据库再次被设计为支持这样的东西,所以这里应该是优化查询的方法.
选项2:黑客攻击
您的第二个选项,只是将所有角色存储到varchar中,在性能方面会更好.只加载一个文本字段,一些PHP处理就完成了.另一方面,您可能会遇到几个问题:
方案3:务实的解决方案
每个角色有5个布尔值的第三个选项位于中间:没有办法搞砸它,性能应该不是问题.更新很容易,也可以删除角色或添加新角色.很清楚这些领域是做什么的,所以这方面也没有坏处.它会使您的实体和数据库看起来更难看,您也可以在用户模型中使用角色名称,将true/false字段映射到正确的角色名称,这可能有点令人困惑.
结果
记住这一点,我会选择选项1.可以假设性能是一个问题,但除非我证明了这一点,否则我不会考虑这些问题.最后,当你真正遇到真正的性能问题时,你会怎么做?您可以添加一些额外的硬件,优化dbms,优化查询,或者使用具有更多性能构建的dbms(Hello Oracle!).
如果由于角色表证明您的应用程序运行缓慢,您可以随后使用选项3.您只需更改用户实体并拥有一个提取角色的查询,并为每个用户设置正确的true/false组合.如果软件是干净的,这是一个小时的问题,所以现在不需要在性能可能不好的想法上做.
| 归档时间: |
|
| 查看次数: |
1136 次 |
| 最近记录: |