Xun*_*uni 5 security permissions implementation acl symfony
一般说明
系统应处理组织成嵌套类别的许多项目(请参阅下面的可视示例),同时使客户端能够定义权限规则(请参阅下面的权限规则).它还应该处理独立于任何项目的不同的一般权限(例如"可以查看特定页面?"或"可以邀请新成员?").
所有用户都组织成组.每个用户都有一个他所属的主要组,但他也可能有一些额外的辅助组.
一些用户可以配置为超级管理员,应该被允许做任何事情.
在决定是否允许用户执行某些操作时,权限继承如下:
在定义组权限时,客户端可以使用继承来表示:
注意:我应该能够从数据库中请求当前用户可以编辑/查看的最后10个项目,每个项目的权限应该由数据库决定,我不想在应用程序级别过滤项目的权限如果我可以根据存储在数据库中的信息来决定.
许可规则
规则可能取决于项目的任何属性(例如项目所有者的主要组,创建时间,类别等),该信息存储在数据库中.
规则还可以取决于当前用户的任何属性(例如,注册日期,邀请的成员),请求的操作(例如视图,列表,重命名,撤消删除等)以及运行时已经可用的其他信息(例如url参数) ,配额限制,项目内容,服务器负载),该信息可用于PHP脚本.
请参阅以下示例规则.
数据库模式的可视示例:
Category 1
Nested Category A
item x
Nested Category B
Deeply Nested Category
item w
item y
Category 2
item z
Run Code Online (Sandbox Code Playgroud)
目前,数据库模式如下所示,但如果需要,我可以更改它:(当然这只是模式的一部分,还有其他表和字段)
物品:
id | title | owner_id | category_id
====================================
1 | item x | 2 | 3
2 | item y | 1 | 4
3 | item z | 3 | 2
4 | item w | 1 | 5
Run Code Online (Sandbox Code Playgroud)
类别:
id | parents | title
=====================================
1 | null | Category 1
2 | null | Category 2
3 | 1 | Nested Category A
4 | 1 | Nested Category B
5 | 1/4 | Deeply Nested Category
Run Code Online (Sandbox Code Playgroud)
用户:
id | name | group | all_groups | is_super_admin
===============================================
1 | Tony | 5 | 5 | 1
2 | John | 5 | 5,8,6 | 0
3 | Mike | 4 | 4,7 | 0
4 | Ryan | 6 | 6 | 0
Run Code Online (Sandbox Code Playgroud)
示例规则
以下规则只是应该实现的现实案例的样本.
请注意,这些规则可以在数据库级别决定,就像我的大多数规则一样.
履行
我搜索过symfony docs,stackoverflow等.关于安全性和acls的主题有很多有趣的文章和问题,但我找不到处理这样一个系统的最佳方法.
很明显,我需要某种类型的动态查询构建器来根据定义的规则根据存储在数据库中的信息来过滤行.我假设第二步(涉及未存储在数据库中的信息,如当前服务器负载)可能是为了实现选民(参见本文或此问题中的选民示例),或者有时甚至更简单的解决方案(例如取决于请求路径的规则).如果解决方案涉及多个事项来处理权限,请同时描述如何集成和使用它们.
题
我问的是如何实现这样一个系统,请不要回答symfony文档或其他资源的链接与一般的想法和常见的简单案例.在回答之前,请阅读并理解我的案例.
我意识到这个问题很旧,但答案适用于 Symfony 2.3+,所以我将其发布在这里。
对于这种方法,您应该使用SecurityVoters之类的东西。
通过安全投票器,您可以实现您可以想象的任何访问控制逻辑。
选民的工作方式就像
$this->get('security.authorization_checker')->isGranted('update',$post);
Run Code Online (Sandbox Code Playgroud)
它将检查所有可以操作 Post 实体的选民(请参阅文档),并将他们的投票与选择的策略(肯定、一致、一致)结合起来,以决定当前用户是否有权更新帖子(对于您的第一个 tule 示例)
您可以为单个操作实现多个投票者,并定义策略来决定最终的投票。
您可以将所有组和权限存储在存储库中,并使用选民内部的原则获取它们。
您还可以定义自定义角色层次结构以简化安全工作
| 归档时间: |
|
| 查看次数: |
1759 次 |
| 最近记录: |