- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在努力在 CakePHP 中实现 ACL。阅读 cake manual 中的文档后以及其他一些教程、博客文章等,我发现 Aran Johnson 的优秀教程帮助填补了许多空白。他的例子似乎与我在一些地方看到的其他例子有冲突——特别是在他使用的 ARO 树结构中。
在他的examples他的用户组被设置为级联树,最通用的用户类型位于树的顶部,其子级为每个更受限制的访问类型分支。在其他地方,我通常将每个用户类型视为相同通用用户类型的子级。
如何在 CakePHP 中设置 ARO 和 ACO?任何和所有提示都表示赞赏!
最佳答案
CakePHP 的内置 ACL 系统非常强大,但在实际实现细节方面的文档却很少。我们在许多基于 CakePHP 的项目中成功使用的系统如下。
它是对一些已被documented elsewhere 的组级访问系统的修改。 .我们系统的目标是建立一个简单的系统,用户在组级别上获得授权,但他们可以对他们创建的项目或每个用户拥有特定的附加权限。我们希望避免在 aros_acos
表中为每个用户(或者,更具体地说,为每个 ARO)创建一个特定条目。
我们有一个用户表和一个角色表。
用户
user_id、user_name、role_id
角色
id, role_name
为每个角色创建 ARO 树(我们通常有 4 个角色 - 未授权访客 (id 1)、授权用户 (id 2)、站点管理员 (id 3) 和管理员 (id 4)):
cake acl create aro/Role.1
cake acl create aro 1 Role.2 ... etc ...
在此之后,您必须使用 SQL 或 phpMyAdmin 或类似工具为所有这些添加别名,因为 cake 命令行工具不会这样做。我们所有人都使用“Role-{id}”和“User-{id}”。
然后我们创建一个ROOT ACO -
cake acl create aco/'ROOT'
然后为这个ROOT下的所有 Controller 创建ACO:
cake acl create aco 'ROOT' 'MyController' ...等...
到目前为止一切正常。我们在 aros_acos 表中添加了一个名为 _editown
的附加字段,我们可以将其用作 ACL 组件的 actionMap 中的附加操作。
CREATE TABLE IF NOT EXISTS `aros_acos` (
`id` int(11) NOT NULL auto_increment,
`aro_id` int(11) default NULL,
`aco_id` int(11) default NULL,
`_create` int(11) NOT NULL default '0',
`_read` int(11) NOT NULL default '0',
`_update` int(11) NOT NULL default '0',
`_delete` int(11) NOT NULL default '0',
`_editown` int(11) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `acl` (`aro_id`,`aco_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后我们可以设置 Auth 组件以使用“crud”方法,该方法根据 AclComponent::check() 验证请求的 Controller /操作。在 app_controller 中,我们有以下内容:
private function setupAuth() {
if(isset($this->Auth)) {
....
$this->Auth->authorize = 'crud';
$this->Auth->actionMap = array( 'index' => 'read',
'add' => 'create',
'edit' => 'update'
'editMine' => 'editown',
'view' => 'read'
... etc ...
);
... etc ...
}
}
同样,这是相当标准的 CakePHP 东西。然后我们在 AppController 中有一个 checkAccess 方法,它添加了组级别的东西来检查是检查组 ARO 还是用户 ARO 的访问权限:
private function checkAccess() {
if(!$user = $this->Auth->user()) {
$role_alias = 'Role-1';
$user_alias = null;
} else {
$role_alias = 'Role-' . $user['User']['role_id'];
$user_alias = 'User-' . $user['User']['id'];
}
// do we have an aro for this user?
if($user_alias && ($user_aro = $this->User->Aro->findByAlias($user_alias))) {
$aro_alias = $user_alias;
} else {
$aro_alias = $role_alias;
}
if ('editown' == $this->Auth->actionMap[$this->action]) {
if($this->Acl->check($aro_alias, $this->name, 'editown') and $this->isMine()) {
$this->Auth->allow();
} else {
$this->Auth->authorize = 'controller';
$this->Auth->deny('*');
}
} else {
// check this user-level aro for access
if($this->Acl->check($aro_alias, $this->name, $this->Auth->actionMap[$this->action])) {
$this->Auth->allow();
} else {
$this->Auth->authorize = 'controller';
$this->Auth->deny('*');
}
}
}
setupAuth()
和 checkAccess()
方法在 AppController
的 beforeFilter(
) 中调用打回来。 AppControler 中也有一个 isMine
方法(见下文),它只检查所请求项目的 user_id 是否与当前经过身份验证的用户相同。为了清楚起见,我将其省略了。
这就是它的全部内容。然后,您可以允许/拒绝特定组访问特定 acos -
cake acl grant 'Role-2' 'MyController' 'read'
cake acl grant 'Role-2' 'MyController' 'editown'
cake acl deny 'Role-2' 'MyController' 'update'
cake acl deny 'Role-2' 'MyController' 'delete'
我相信你明白了。
无论如何,这个答案比我预期的要长,而且它可能几乎没有意义,但我希望它对你有所帮助......
-- 编辑--
根据要求,这里有一个经过编辑的(纯粹是为了清楚起见 - 我们的样板代码中有很多东西在这里没有意义)我们在 AppController 中拥有的 isMine()
方法。我也删除了很多错误检查的东西,但这是它的本质:
function isMine($model=null, $id=null, $usermodel='User', $foreignkey='user_id') {
if(empty($model)) {
// default model is first item in $this->uses array
$model = $this->uses[0];
}
if(empty($id)) {
if(!empty($this->passedArgs['id'])) {
$id = $this->passedArgs['id'];
} elseif(!empty($this->passedArgs[0])) {
$id = $this->passedArgs[0];
}
}
if(is_array($id)) {
foreach($id as $i) {
if(!$this->_isMine($model, $i, $usermodel, $foreignkey)) {
return false;
}
}
return true;
}
return $this->_isMine($model, $id, $usermodel, $foreignkey);
}
function _isMine($model, $id, $usermodel='User', $foreignkey='user_id') {
$user = Configure::read('curr.loggedinuser'); // this is set in the UsersController on successful login
if(isset($this->$model)) {
$model = $this->$model;
} else {
$model = ClassRegistry::init($model);
}
//read model
if(!($record = $model->read(null, $id))) {
return false;
}
//get foreign key
if($usermodel == $model->alias) {
if($record[$model->alias][$model->primaryKey] == $user['User']['id']) {
return true;
}
} elseif($record[$model->alias][$foreignkey] == $user['User']['id']) {
return true;
}
return false;
}
关于php - CakePHP ACL 数据库设置 : ARO/ACO structure?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54230/
这个问题已经有答案了: Is there any way to accept only numeric values in a JTextField? (20 个回答) It's possible i
我使用戴尔 XPS M1710。笔记本电脑的盖子、侧面扬声器和前置扬声器都有灯(3 组灯可以单独调节)和鼠标垫下方的灯。在 BIOS 中,我可以更改这些灯的颜色,至少是每个组。另外,我可以在鼠标垫下打
我知道我可以使用 在 iOS 5 中打开设置应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"
我有一个 Django 应用程序,我正在尝试为其设置文档。目录结构如下: - doc - project | - manage.py 我已经设置了路径以便 Sphinx 可以看到东西,但是当我尝试使用
我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxC
我在具有以下配置的服务器内运行了 Drupal 安装: StartServers 5 MinSpareServers 5 MaxSpareServers 15 MaxClien
是否可以使用 Microsoft.Web.Administration 包为给定的 location 配置 asp 设置? 我想以编程方式将以下部分添加到本地 IIS applicationHost.
我一直在阅读为 kube-proxy 提供参数的文档,但没有解释应该如何使用这些参数。我使用 az aks create 创建我的集群使用 azure-cli 程序,然后我获得凭据并使用 kubect
我想知道与在 PHP 中使用 setcookie() 函数相比,在客户端通过 JavaScript 设置一些 cookie 是否有任何明显的优势?我能想到的唯一原因是减少一些网络流量(第一次)。但不是
我有一个按钮可以将 body class 设置为 .blackout 我正在使用 js-cookie设置cookie,下面的代码与我的按钮相关联。 $('#boToggle').on('click'
我有一堆自定义的 HTML div。我将其中的 3 存储在具有 slide 类的 div 中。然后,我使用该幻灯片类调用 slick 函数并应用如下设置: $('.slide').slick({
我正在创建一个应该在 Windows 8(桌面)上运行的应用 我需要: 允许用户使用我的应用启动“文件历史记录”。我需要找到打开“文件历史记录”的命令行。 我需要能够显示“文件历史记录”的当前设置。
我刚买了一台新的 MacBook Pro,并尝试在系统中设置 RVM。我安装了 RVM 并将默认设置为 ➜ rvm list default Default Ruby (for new shells)
由于有关 Firestore 中时间戳行为即将发生变化的警告,我正在尝试更改我的应用的初始化代码。 The behavior for Date objects stored in Firestore
在 ICS 中,网络 -> 数据使用设置屏幕中现在有“限制后台数据”设置。 有没有办法以编程方式为我的应用程序设置“限制后台数据”? 或 有没有办法为我的应用程序调出具有选项的“数据使用”设置? 最佳
我正在尝试使用 NextJS 应用程序设置 Jest,目前在 jest.config.js : module.exports = { testPathIgnorePatterns: ["/.n
我最近升级到 FlashDevelop 4,这当然已经将我之前的所有设置恢复到原来的状态。 我遇到的问题是我无法在新设置窗口的哪个位置找到关闭它在方括号、大括号等之前插入的自动空格的选项。 即它会自动
有没有办法以编程方式访问 iPhone/iPod touch 设置? 谢谢。比兰奇 最佳答案 大多数用户设置可以通过读取存储在 /User/Library/Preferences/ 中的属性列表来访问
删除某些值时,我需要选择哪些设置来维护有序队列。我创建了带有自动增量和主键的 id 的表。当我第一次插入值时,没问题。就像 1,2,3,4,5... 当删除某些值时,顺序会发生变化,例如 1,5,3.
我正在尝试设置示例 Symfony2 项目,如此处所示 http://symfony.com/doc/current/quick_tour/the_big_picture.html 在访问 confi
我是一名优秀的程序员,十分优秀!