pranaya/cakephp-zone-acl

一个基于应用区域的 CakePHP Acl 插件,旨在提高灵活性和简洁性

2.0.0 2015-04-04 16:46 UTC

This package is not auto-updated.

Last update: 2024-09-28 17:54:27 UTC


README

CakePHP ZoneAcl 插件以独特的方式处理 CakePHP 应用程序中的权限。ZoneAcl 允许您将应用程序控制器/操作分为组,称为区域。在定义了任意区域后,您可以决定哪些用户或组可以根据您喜欢的任何标准访问哪些区域。它为您的应用程序 acl 提供了简单性和灵活性。

需求

  • CakePHP 2.x

安装

方法 1

  1. 下载此文件:http://github.com/pranaya/cakephp-zone-acl/zipball/master
  2. 将内容解压缩到 app/Plugin/ZoneAcl

方法 2

使用 composer

将以下内容添加到您的 composer.json 文件中

"require": {
    "pranaya/cakephp-zone-acl": "[VERSION].*"
}

然后运行 composer installcomposer update 命令

加载插件

在 app/bootstrap.php

CakePlugin::load('ZoneAcl', array('bootstrap' => true));

用法

配置

在 app/Config/core.php

修改

Configure::write('Acl.classname', 'DbAcl');
Configure::write('Acl.database', 'default');

Configure::write('Acl.classname', 'ZoneAcl.ZoneAcl');
//Configure::write('Acl.database', 'default');

然后将 app/Plugin/ZoneAcl/Config/zone-acl.ini 文件复制到 app/Config/zone-acl.ini

如果您想使用 ZoneAcl.ZoneAclHtml 辅助函数。

在 app/Controller/AppController.php

<?php
class AppController extends Controller {
	public $helpers = array('ZoneAcl.ZoneAclHtml');
}

设置区域

区域在 ini 文件中定义。定义区域并向其中添加 URL(控制器/操作)非常简单。

区域用 "[zone:zonename]" 表示。只要它们的名称不匹配,您可以添加任意多的区域。请使用数组键友好的区域名称。

一个 URL 可以属于多个区域,如果您愿意的话。区域中的 URL 可以用正则表达式(推荐)或简单地使用整个控制器/操作组合来定义。

URL 格式

  • 控制器/操作
  • 插件/控制器/操作

您必须使用实际的控制器和操作名称,即使用 UserProfiles 而不是 user_profiles 表示 UserProfilesController,并使用 view_detail 表示 view_detail 操作。默认情况下,URL 是大小写敏感的,可以通过将“case-sensitive”设置更改为“false”来关闭此设置。请参考 zone-acl.ini 文件以获取更多有用的 URL 示例。

示例:app/Config/zone-acl.ini

[settings]
case-sensitive = true

[zone:admin]
; allow all admin_ actions
url[] = '(\w)+/admin_*'

; allow all plugin's admin_ action
url[] = '(\w+)/(\w+)/admin_*'

; allow UserProfile controller's view_detail action, just an example
url[] = 'UserProfile/view_detail'

[zone:general-user]
; allow all actions except admin_ actions
url[] = '(\w+)/(?!admin_)*'

; allow all plugin actions except admin_ actions
url[] = '(\w+)/(\w+)/(?!admin_)*'

设置 Aro

设置 Aro 非常简单。基本上,它是通过会话数据识别用户并确定他们可以访问哪些区域。这部分完全取决于您的应用程序需求。它可以像需要的那样简单或复杂。Aro 可以是任何实现 ZoneAroInterface 的对象。

示例

<?php 

App::uses('ZoneAroInterface', 'ZoneAcl.Controller/Component/Acl');

class MySimpleAro implements ZoneAroInterface { 

	public function getAllowedZones($aro) { 
		// $aro contains user's session data 
		$userId = $aro['User']['id']; 
		$groupId = $aro['User']['group_id']; 
		 
		// find what zones user can access with those info 
		// you can even store the what zones the 
		// user can access in the session itself 
		$zones = array(); 
		 
		$zones[] = 'admin'; 
		$zones[] = 'general-user'; 
		
		// return array of zone names 
		//the user can access
		return $zones; 
	} 
}

一旦您的 Aro 准备好,在 AppController::beforeFilter() 中将其连接到 ZoneAcl。

示例

<?php 

App::uses('MySimpleAro', 'Path/To/Class'); 

class AppController extends Controller { 
	 
	public function beforeFilter() { 
		// plug ARO object
		ZoneAcl::setAro(new MySimpleAro()); 
	} 
}

ZoneAclHtml 辅助函数

ZoneAclHtml 辅助函数提供了一种方便的方式来隐藏不允许的链接。它扩展了 HtmlHelper。它提供了两种方法。

任何视图文件

<?php

// returns true if the current user is 
// allowed on that url
$this->ZoneAclHtml->isAllowed($url); 

// same as HtmlHelper::link() except it returns empty link
// when user is not allowed
$this->ZoneAclHtml->link($title, $url); 

提示

  • 经常使用正则表达式以优化性能并减少 ini 文件中的 URL 数量
  • 将流量高的 URL 放在列表顶部,以便更快地匹配
  • 将控制器的长操作列表分开成几个 URL,以便更容易阅读您的设置

许可证

MIT 许可证 (MIT)

版权所有 (c) 2015 Pranaya

特此授予任何获得此软件和相关文档副本(“软件”)的人,免费使用该软件不受限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许提供软件的人这样做,但须遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途的适用性和非侵权性。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论该责任是基于合同、侵权或其他方式,无论该索赔、损害或其他责任是否与软件或软件的使用或其他方式有关。