dev-master 2020-01-29 06:21 UTC

This package is auto-updated.

Last update: 2024-08-29 05:06:34 UTC


README

我们已经在4.3版本中使用这个Acl很长时间了,发现它大大加快了我们的开发过程。这是一个真正让您专注于业务逻辑的系统。在这里,我们将它作为atk4/ui插件推出。

基本功能

此ACL系统的基本很简单。任何系统中的每个实体都有一个或多个状态,每个状态都有一些可执行的操作。在任何ACL中,您都希望完成以下两项工作。

  • 决定哪些状态可见给哪些用户(例如,假设您有一个发票文档,它在不同的状态下有以下操作)

     $actions = [
      		'Active'=>['view','edit','delete','deactivate','superpass'],
      		'InActive'=>['view','edit','delete','activate'],
      		];
    

现在您想管理以下ACL

  • 草稿用户只能看到他们创建的内容,并且他们应该能够提交它。
  • 具有审批权限的权限应该看到所有提交的文档,并且能够审批发票。
  • 创建草稿的人应该能够看到已批准的发票状态,但他将无法对此执行任何操作。
  • 批准的发票应启用send_via_email并仅允许某些角色使用。
  • 实现所有这些功能应该很容易,系统应该帮助您以非常简单的方法实现。

这就是Atk4Acl的作用。

安装

安装过程就像

  • composer require gowrav-vishwakarma/atk4acl
  • 第二步是将Sql文件填充到vendor/gowrav-vishwakarma/atk4acl/docs文件夹中。
  • vendor/gowrav-vishwakarma/atk4acl/src/config-example.php中定义的一些配置填充到您的配置文件中(而不是此文件)。

设置带有角色的认证模型

  • 到目前为止,您有一个用户模型,它使用atk4\login作为$app->auth->model
  • $your_model->hasOne('role_id',new \atk4\acl\Model\Role)->withTitle();
  • 就这样。顺便说一下,如果您想使用配置来使用Department->Post->Employee,并且想在Employee中用post_id作为角色,这也是可定制的。

进入操作

设置完成后,您现在可以开始使用它了。您应该关注以下两点

  • 如何定义权限
  • 如何编写状态/操作关系并编写操作代码

您将做的第一件事是使用\atk4\acl\CRUD,如下所示

$crud = $this->add('\atk4\acl\CRUD');
$crud->setModel('\your\namespace\Model\Invoice');

基于您在配置中定义的超级作用域角色

$config['acl']=[
	'AclModelClass'=>'\atk4\acl\Model\Acl',
	'UserModel' =>'\your\namespace\Model\Employee',
	'SuperUserRoles'=>['SuperUser'], ⇐ HERE
];

您将自动在CRUD上方获得ACL按钮,它将为您管理一切。但是,为了使其运行,您需要首先在模型中定义您的状态和操作。

enter image description here

enter image description here

enter image description here

在状态上定义操作就像在模型中创建一个名为**public $actions **的公共类变量一样简单。

 $actions = [
    		'Active'=>['view','edit','delete','deactivate','superpass'],
    		'InActive'=>['view','edit','delete','activate'],
    		];

其中“查看”、“编辑”和“删除”操作将自动处理,使用选项 SelfOnly , All, None

SelfOnly意味着用户只能执行他/她自己创建的操作(基于模型中的created_by_id字段)。

而All允许用户查看该状态的所有实体。

如果您的模型具有assigned_to_id字段,您甚至可以仅管理执行分配实体操作的用户。

下面是有趣的代码部分。如何为这些操作编写代码。对于查看、编辑和删除,您不需要编写任何代码。但对于其他操作,您只需在模型中创建具有该操作名称的函数即可。例如,要编写“禁用”操作,只需在模型中创建一个名为“deactive”的函数即可。

class Invoice extnds \atk4\data\Model {
	...
	public $actions =[
		'Active'=>['view','edit','delete','deactivate'],
		'InActive'=>['view','edit','delete','activate'],
	]
	
	function init(){
		parent::init();
		...
		$this->addFields([
    	['name'],
    	['username'],
    	['password'],
        ['joined_on','type'=>'date'],
        ['status','enum'=>array_keys($this->actions)], <== Here is your staus field
    ]);
		...
	}
	...
	function deactivate(){
		$this['status']='InActive';
		$this->save();
	}
	function activate(){
		$this['status']='Active';
		$this->save();
	}
}

enter image description here

乐趣不止于此,有时你需要用户输入来执行某些操作,例如创建表单并在提交时进行某些操作。好吧,只需在任何/所有状态下定义一个更多的动作,并创建一个以 “page_” 为前缀的函数名,例如。

class Invoice extnds \atk4\data\Model {
		...
		public $actions =[
			'Active'=>['view','edit','delete','deactivate','update_email'],
			'InActive'=>['view','edit','delete','activate'],
		]
		...
		function page_update_email($p){
    		$form = $p->add('Form');
    		$form->addField('email');
    		$form->onSubmit(function($f){
	    		$this['email'] = $f->model['email'];
	    		$this->save();
	    		return "Updated"
    		});
		}
    }

这难道不有趣吗。我们正在努力开发下一个版本,以在页面功能中实现自动对话框关闭和 CRUD 重新加载。

目前,这只是初始提交,我们很快就会看到更多的更新。