我正在努力实现自定义框架的访问控制。
不需要 RBAC 粒度,所以我决定使用某种 ACL 来存放资源 Controller Action 。
这是数据库结构:
用户:
用户组:
users_to_user_groups:
资源( Controller 操作):
resources_to_user_groups:
这是[伪]代码。
$user = new User; // This will be currently logged in user ...
$acl = new Acl($user);
$dispatcher = new Dispatcher($acl);
$dispatcher->dispatch('users', 'new');
class Dispatcher
{
public function dispatch($controller, $action)
{
$permission = $controller . '/' . $action;
if(!$this->acl->isAllowed($permission))
{
throw new AccessDeniedException("Access denied");
}
// User is authorized to execute this action, dispatch ...
}
}
我喜欢这种方法...直到我意识到还有很多 XHR 请求。
例如发票列表使用XHR请求获取总金额,订单列表使用XHR请求 加载订单位置和其他数据等。
所以,肯定有一些资源分组,比如新建表resource_groups:
...而不是将资源分配给用户组,而是将资源组分配给用户组。
感觉好复杂。这是正确的方法吗?有什么可以改进的?有没有框架解决这个问题?
最佳答案
在过去的一年里,我一直在处理同样的问题,下面是我的解决方法。
首先我使用了Zend Framework's ACL库作为基本引擎,告诉我某些用户是否可以访问某些资源。由于 ZF 已经支持用户分组和角色(包括角色层次结构),您无需再为此担心。
将用户分组和角色放在一边,接下来是 ZF 内部不支持的资源分组(很遗憾)。我相信这是您的问题所关注的部分。然而,您可以使用 ZF 并对其进行扩展以满足您的需求。您需要做的就是为资源(平面或分层)提出一种分组机制。然后您可以按照其手册中的说明使用 ZF。
这是一个关于如何做到这一点的例子:
构建ACL引擎和其他基本对象:
$acl = new Zend_Acl();
$acl->addRole(new Zend_Acl_Role('guest'))
->addRole(new Zend_Acl_Role('member'))
->addRole(new Zend_Acl_Role('admin'));
$parents = array('guest', 'member', 'admin');
$acl->addRole(new Zend_Acl_Role('someUser'), $parents);
定义您的资源分组:
$resources = array(
'group 1' => array(
'resource 1'
, 'resource 2'
, 'resource 3'
)
, 'group 2' => array(
'resource 1'
, 'resource 4'
, 'resource 5'
)
);
将您的资源引入 ACL 的引擎:
function addResource(Zend_Acl $acl, $resources, $groupName)
{
foreach ($resources[$groupName] as $resource) {
$acl->add(new Zend_Acl_Resource($resource));
}
}
addResource($acl, $resources, 'group 2');
使用 ACL 的引擎查询权限:
echo $acl->isAllowed('someUser', 'resource 1') ? 'allowed' : 'denied';
如您所见,我在这里没有做任何特别的事情。这里引入的唯一新概念是添加到 ACL 引擎的资源与用于查询它的资源不同。但它在我们实际调用 ZF 的库之前完成了一层,因此调用查询 ZF 的 ACL 仍然有效。
我希望我能把我的观点写清楚。并且不要忘记我只是想给你一个概念,你需要自己想出实际的实现。
关于php - 访问控制和 XHR 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16463196/
类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].有没有一种方法可以
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
当我在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
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O