jjzjj

php - Symfony2 - 动态角色管理

coder 2024-05-03 原文

我正在开发一个 CRM,它将具有高级授权和在系统中具有特定角色的组中管理用户的功能。

基本上,我想做的是:

  • 管理(领域)模型/ Controller /操作的动态授权
  • 管理对象和字段的动态授权。

我知道 security.yml 文件中的 ROLE_xxxx,但我不想对角色进行硬编码。

例如,我想要一种矩阵/网格, super 管理员可以在其中创建自定义授权角色。

其中一个角色可能是:“团队负责人”可以查看和编辑员工的电子邮件地址,但不能查看或编辑 Employee_Wage 字段。

另一个用例是用户组“Accounting”中的用户可以调用操作 generateInvoiceAction() 但他无法访问操作 createNewEmployeeAction()。

另一个用例是 PROJECT LEADER 可以使用 newProjectAction() 添加项目,但 PROJECT 对象的某些字段/属性对 PROJECT LEADER 组不可见/不可访问

我知道您可以在安全和路由中设置这些,但我不想对这些角色进行硬编码。例如,如果公司决定他们想要创建一个具有特定角色的新组,他们应该能够这样做。

我的(伪)解决方案

  1. 检查每个域模型、操作/函数和对象/字段并为 CRUD 创建角色,例如创建 EMPLOYEE_FIRSTNAME_READ、EMPLOYEE_FIRSTNAME_UPDATE、EMPLOYEE_CREATE、EMPLOYEE_EDIT、EMPLOYEE_DELETE 等...

  2. 创建一个带有标题字段的数据库对象“组”,其中包含所有角色的组合数组。

  3. 将用户放入组中

这是要走的路还是有更好的方法在 Symfony2 中实现这一目标?

基本上:创建一个具有基于域模型、对象、字段等的特定角色的组......可以使用管理员后端进行配置。

我希望我的解释是正确的,请随时回复并询问更多信息。

(我记得旧版本的 Invision Power Board 中有这样的东西,您可以在其中配置权限掩码网格并将其附加到组)

最佳答案

根据你在这里所说的,我认为要走的路是使用 ACL

http://symfony.com/doc/master/cookbook/security/acl.html

然而,您必须自己检查权限,开始每个安全方法,像这样:

$securityContext = $this->get('security.context');
$comment = ... // load using Doctrine?

if (false === $securityContext->isGranted('EDIT', $comment))
{
    throw new AccessDeniedException();
}

如果您要扩展 Symfony 的 Controller 类,我强烈建议您再添加一个类,在这些类之间将实现通用的安全逻辑,以尽可能减少错误...

另一方面,当使用服务时,您可以提供对象作为参数,您可以依赖 JMSSecurityExtraBundle 中的 @SecureParam 注释(我假设您使用它) 检查相关域对象权限。

http://jmsyst.com/bundles/JMSSecurityExtraBundle/master/annotations

希望这对您有所帮助...

关于php - Symfony2 - 动态角色管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13847592/

有关php - Symfony2 - 动态角色管理的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  3. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  4. ruby - (Ruby || Python) 窗口管理器 - 2

    我想用这两种语言中的任何一种(最好是ruby​​)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生

  5. ruby - 在 Ruby 中动态创建数组 - 2

    有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.

  6. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

  7. ruby-on-rails - 事件管理员和自定义方法 - 2

    这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什

  8. ruby-on-rails - carrierwave:在序列化动态属性上安装 uploader - 2

    首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟

  9. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  10. ruby - 在 Ruby 中动态生成多维数组 - 2

    我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]

随机推荐