我已经制作了实现这个自定义ACL系统所需的数据库和php代码。现在我必须“授权”当前用户,这就是我需要您的建议的地方。
该系统基于对系统用户和系统模块的灵活权限分配。它也有一些预定义的,比方说用户组,还能够创建完全自定义的组。全局规则也可以应用在 ACL 之上,但它的优先级最低,高于分配给组或用户的权限。
为了更好地描绘它:
预定义组:
以下是访问级别(名称/值对):
注意:“允许”在“禁止”上具有更高的优先级,因此如果您的用户 X 在 A 组上处于“不允许”状态,但在特定访问权限上对 B 组处于“允许”状态,那么他最终将处于“允许”状态。另一方面,如果用户 X 通过成为“管理员”组的成员而具有“完全访问权限”,但如果他只是对某个访问权限“拒绝”,则他最后没有访问权限,这意味着“拒绝”在“允许”上具有更高的优先级。
在顶层你可能有这样的东西:
我的问题是如何处理这类支票?想象一下我们有一个简单的授权机制。我们将在我们的 $_SESSION['user'] 中有一些索引,例如 $_SESSION['user']['login'] = true; 和 $_SESSION ['user']['id'] = $row['user_id'],对吧?
现在,如果您想在脚本中实现这种机制,您将如何实现?
我可能会首先检查全局访问规则。然后我会查看用户是否已经登录。如果是,只需获取他的所有组,然后查看权限表以查看分配给他的组和用户 ID 的权限,然后将它们存储在用户 session 中。然后当模块说这是我需要的运行权限时,我会查看用户是否有足够的权限访问请求的模块。
看起来很复杂!非常感谢任何帮助或建议! :)
编辑:
我没有使用任何框架。其实我用,但它是我自己的。所以,这里没有预制的 ACL!
更新:
您是否知道一种有效的方法来确定(覆盖/替换?)ACL 的优先级?
Deny 最高,然后是 Allow,然后是 Disallow。此外,User 分配的 ACL 最高,然后是 Group ACL,最后是 Global ACL。
这是我最后想出的:
有一个数组,像这样:
$_SESSION['ACL'][$module][$action] = $access_level; // 0, 1, 2, 3
首先,我会查找所有全局规则 *,并将它们放在数组中:
// The current user can see the map, applied by a global rule
$_SESSION['ACL']['map']['render'] = 1;
// All the other permissions are disallowed by default
$_SESSION['ACL']['*']['*'] = 0;
// He can edit his preferences, (Owner)
$_SESSION['ACL']['user']['*'] = 3;
然后,我将查找基于组的 ACL:
// User could access the Analyze module, all the methods
// with Permission Name "report". Applied by being a member
// of "Moderator" Group
$_SESSION['ACL']['analyze']['report'] = 1;
// User NOT allowed to access "groups" module, let say
// it reserved for "admin" group! - To see the ACLs' Overwriting!
$_SESSION['ACL']['groups']['*'] = 0;
毕竟,我会寻找用户分配的 ACL:
// User have Full Access to the "groups" module.
// It's gonna replace the last ACL, applied by "Moderator" group
// Note that the order of processing ACLs is IMPORTANT!
$_SESSION['ACL']['groups']['*'] = 1;
我想它会很完美,有什么想法吗?
它现在工作得很好:)
最佳答案
下面是我在MVC环境下的处理方式,创建一个具有这种结构的表:
(id, group_id(int), user_id(int), controller(varchar), action(varchar))
然后我在组和 user_id 上使用 -1 来表示通配符,在 Controller 和操作上使用 *。因此,在您的示例中,管理员可以执行任何操作 (1,4,-1,,)。或者假设 Power Users 可以修改用户 (2,3,-1,user,*)。或者如果你想给一个人(user_id 为 34)一个权限,不管他们在哪个组(3,-1,34,user,update)。如果你想存储你的 0-3 允许,禁止,只需添加一列。然后,您只需检查正在调用哪个 Controller 和操作,并找到适用于此人的组以及具体适用于他们的任何权限。
关于PHP 复杂的基于角色的访问控制列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12370162/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时