>  기사  >  php教程  >  Yii의 Srbac 플러그인 사용법에 대한 자세한 설명

Yii의 Srbac 플러그인 사용법에 대한 자세한 설명

高洛峰
高洛峰원래의
2016-12-30 16:05:431479검색

이 기사의 예에서는 Yii의 Srbac 플러그인 사용법을 설명합니다. 참고하시라고 자세한 내용을 공유합니다.

Yii의 rbac는 arbc 모듈 확장 설치부터 디버깅과 원리 분석까지 간헐적으로 시간이 많이 걸렸습니다. 물론 이해한 후에는 Yii의 abrc가 매우 편리하고 리소스 제어 액세스를 쉽게 구현할 수 있다는 점을 알게 될 것입니다. 이는 매우 강력합니다. 이제 공부노트를 정리해서 공유하겠습니다. authMangner 구성 요소는 rbac를 구현하지만 시각적 편집 관리는 구현하지 않습니다. 현재 Srbac와 Right라는 두 가지 공식 확장 모듈이 있으며 이를 사용하여 역할, 작업 및 작업을 매우 편리하게 관리합니다.

역할 기반 액세스 제어는 간단하면서도 강력한 중앙 집중식 액세스 제어입니다. Yii 프레임워크를 기반으로 하는 authManager 구성 요소는 계층적 RBAC를 구현하며, 이는 개발 중에 발생하는 일부 리소스 제어 액세스 문제를 해결하는 데 도움이 될 수 있습니다.

이 두 확장 모듈의 경우 기능은 실제로 유사하지만 인터페이스가 다릅니다. 원하는 스타일에 따라 테스트할 모듈을 선택하세요. 설치 및 디버깅에 대해서는 다운로드만 하면 되며, 내부에 자세한 소개가 있습니다. authManager 구성 요소 구현의 원리를 분석해 보겠습니다.

권한 부여 프로젝트는 사용자가 리소스에 접근할 수 있는 권한을 가진 역할에 속해 있는지 확인하여 해당 사용자가 특정 리소스를 운영할 수 있는지 여부를 결정하는 프로젝트입니다. 여기서 우리는 승인된 프로젝트, 역할, 작업 및 운영 간의 관계를 이해해야 합니다.

1. 권한 부여 프로젝트는 역할, 작업, 작업으로 나눌 수 있습니다.
2. 역할은 여러 작업으로 구성될 수 있습니다. 🎜>4 .작업은 권한이므로 분할할 수 없습니다.

비즈니스 규칙 문제는 실제로 권한을 확인할 때 실행되는 PHP 코드 조각이라는 점도 언급해야 합니다.

아래에서는 인증 할당, 인증 항목 및 인증 항목 하위의 구조라는 세 개의 테이블이 필요한 rbac 구현을 분석합니다.

itemname varchar(64) 역할 이름, 대소문자 구분

userid varchar ( 64) 사용자 ID는 자신의 프로젝트에 있는 사용자 테이블의 ID입니다

bizrule text 비즈니스 규칙, PHP 코드
데이터 텍스트 bizrule

name varchar에 매개변수를 제공하는 데 사용되는 직렬화된 배열 ( 64) 인증 할당의 항목 이름이 동일합니다

type 정수 유형 식별(0,1,2)

|

|--------- 0은 작업을 의미합니다
| -- ------ 1은 작업
|--------- 2는 역할

설명 텍스트 관련 설명

bizrule 텍스트 비즈니스 규칙, PHP 코드 조각

데이터 텍스트

parent varchar(64) parent name, [role name, can also be a task];

children varchar(64) child object name 에 매개 변수를 제공하는 데 사용되는 직렬화된 배열입니다. [작업 이름도 작업일 수 있음];


확인 방법 CWebUser::checkAccess()를 사용합니다. 다음은 데모 코드 설명입니다.

if(Yii::app()->user->checkAccess(what,$params)) {
  //what  --- role,或者task,也可以是operation,
  //params --- 是传进业务规则的参数key-value;
}

다음은 사용자가 기사를 삭제하는 구체적인 작업을 보여줍니다.

$params=array('uid'=>$id);
if(Yii::app()->user->checkAccess('delArticle',$params)) {
  //检查当前用户是否有删除文章权限
  //并且使用业务规则,检查用户id等于文章里面的作者id
  //通过验证,就执行删除操作
}
1. 권한 규칙 테이블 설정: 모듈 모듈 구성 파일에 배치할 수 있습니다.

2. 규칙을 구현하면 컨트롤러는 원래 Controller

public function init() {
  //操作权限表,必须存在以下字段:
  //itemname角色名/ID,
  //type授权项目类型/1(任务)或者2(角色),
  //bizrule权限/逻辑运算表达式为false是有权限操作,
  //data数据/YII暂无利用
  Yii::app()->authManager->itemTable = 'AuthItem';
  //会员组-权限对应表,必须存在以下字段:
  //child子角色/ID,
  //parent父角色/ID,此表可循环执行,可多级继承
  Yii::app()->authManager->itemChildTable = 'uthItemChild';
  //会员-会员组对应表,会员组可直接为操作名称,必须存在以下字段:
  //itemname角色名/ID,
  //userid用户名/ID,
  //bizrule权限/逻辑运算表达式为false是有权限操作,
  //data数据/YII暂无利用
  Yii::app()->authManager->assignmentTable = 'zd_mem_glog';
}

3. SBaseController는 기본 클래스 Controller를 상속하고 권한 확인을 구현하기 위해 앞에 beforeAction을 추가합니다.

class ProductController extends SBaseController
{
    ........
}
class SBaseController extends Controller
{
    ........
}

4. CDbAuthManager가 현재 사용자 역할을 읽습니다.

protected function beforeAction($action) {
  //载入模块分隔符
  $del = Helper::findModule('srbac')->delimeter;
  //取得前模块名称
  $mod = $this->module !== null ? $this->module->id . $del : "";
  $contrArr = explode("/", $this->id);
  $contrArr[sizeof($contrArr) - 1] = ucfirst($contrArr[sizeof($contrArr) - 1]);
  $controller = implode(".", $contrArr);
  $controller = str_replace("/", ".", $this->id);
  // 生成静态页面 模块+分隔符+控制器(首字母大写)+方法(首字母大写)例: model-ControllerAction
  if(sizeof($contrArr)==1){
   $controller = ucfirst($controller);
  }
  $access = $mod . $controller . ucfirst($this->action->id);
  //验证访问页面地址是否在总是允许列表里面,是返回有权限
  if (in_array($access, $this->allowedAccess())) {
   return true;
  }
  //验证SRBAC有无安装,没在安装,返回的权限访问
  if (!Yii::app()->getModule('srbac')->isInstalled()) {
   return true;
  }
  //验证SRBAC有无开启,没在开启,返回的权限访问
  if (Yii::app()->getModule('srbac')->debug) {
   return true;
  }
  // 权限验证
  if (!Yii::app()->user->checkAccess($access) || Yii::app()->user->isGuest) {
   $this->onUnauthorizedAccess();
  } else {
   return true;
  }
}

5. CDbAuthManager는 역할의 해당 권한을 읽습니다

public function getAuthAssignments($userId)
{
  $rows=$this->db->createCommand()
    ->select()
    ->from($this->assignmentTable)
    ->where('userid=:userid', array(':userid'=>$userId))
    ->queryAll();
  $assignments=array();
  foreach($rows as $row)
  {
    if(($data=@unserialize($row['data']))===false)
      $data=null;
    $assignments[$row['itemname']]=new CAuthAssignment($this,$row['itemname'],$row['userid'],$row['bizrule'],$data);
  }
  return $assignments;
}

6. CDbAuthManager는 권한의 해당 작업을 읽습니다

public function getAuthItem($name)
{
  $row=$this->db->createCommand()
    ->select()
    ->from($this->itemTable)
    ->where('name=:name', array(':name'=>$name))
    ->queryRow();
  if($row!==false)
  {
    if(($data=@unserialize($row['data']))===false)
      $data=null;
    return new CAuthItem($this,$row['name'],$row['type'],$row['description'],$row['bizrule'],$data);
  }
  else
    return null;
}

7. CAuthManager 확인 권한

protected function checkAccessRecursive($itemName,$userId,$params,$assignments)
{
  if(($item=$this->getAuthItem($itemName))===null)
    return false;
  Yii::trace('Checking permission "'.$item->getName().'"','system.web.auth.CDbAuthManager');
  if(!isset($params['userId']))
    $params['userId'] = $userId;
  if($this->executeBizRule($item->getBizRule(),$params,$item->getData()))
  {
    if(in_array($itemName,$this->defaultRoles))
      return true;
    if(isset($assignments[$itemName]))
    {
      $assignment=$assignments[$itemName];
      if($this->executeBizRule($assignment->getBizRule(),$params,$assignment->getData()))
        return true;
    }
    $parents=$this->db->createCommand()
      ->select('parent')
      ->from($this->itemChildTable)
      ->where('child=:name', array(':name'=>$itemName))
      ->queryColumn();
    foreach($parents as $parent)
    {
      if($this->checkAccessRecursive($parent,$userId,$params,$assignments))
        return true;
    }
  }
  return false;
}

SRBAC 테스트

몇가지 SRBAC 구성 정보에 참고할 사항
public function executeBizRule($bizRule,$params,$data)
{
  return $bizRule==='' || $bizRule===null || ($this->showErrors ? eval_r($bizRule)!=0 : @eval_r($bizRule)!=0);
}
위에서 언급한 SRBAC 테마 환경 구성 및 이를 특정 프로젝트에 통합하는 방법(모듈 디렉터리에 넣은 다음 구성 파일에서 일부 구성을 수행할 수 있음)

설치 시 일부 테스트 데이터를 생성할지 여부를 선택할 수 있습니다. 물론 생성되지 않더라도 해당 규칙에 따라 일부 데이터를 수동으로 구성할 수 있습니다.

데이터 구성을 소개하기 전에 SRBAC 모듈의 작동 원리를 약간 이해해야 합니다.

SRBAC 모듈은 역할-작업-운영 관계 간의 매핑입니다. 권한 제어를 구현하는 데 사용됩니다.


사용자는 사용자에 해당합니다.

역할은 시스템에 필요한 모든 역할의 이름에 해당합니다.

작업은 권한을 관리하는 데 필요한 모든 특정 작업의 이름에 해당합니다. (예를 들어 특정 작업의 경우 특정 역할만 액세스하도록 허용합니다.)

在SRBAC的主界面我们可以看到三个icon,分别对应于不同的操作。

我们就先来新建一些我们需要的数据信息(对应于第一个icon):

新建具体的operation:这里的operation的命名需要注意,必须是ControllernameActionname的格式。controller、action的名字组合,且二者的首字母都必须要大写。

新建具体的task:一个task可以对应于多个operation,我们可以按照相应的功能来命名task。例如:可以使用News Management 来表示新闻管理的task。这里的命名没有严格的格式要求,只要做到见名知意即可。

新建具体的roles:这个很简单,就是输入我们需要的角色而已。
ok,数据新建完毕。接下来我们就来到assign页面(对应于第二个icon),对具体的数据来进行映射设置了。

根据前面所说的,将operations分配给各个task,然后我们再将tasks分配给具体的role。

最后再给user指定roles。

到这一步,我们的权限配置基本就结束了。

这时,我们可以通过点击第三个icon来查看我们具体的用户的权限信息时候正确。

确认无误以后,我们就可以来进行我们的权限验证了。

不过,在此之前还有最后一步,我们要确认已经关闭了SRBAC的debug模式。

因为查看源代码我们会发现,如果debug模式是开启状态的话,我们的权限管理是不会起作用的。

可以到config/main.php来进行查看:

'modules' => array(
  'srbac' => array(
    'userclass' => 'User',
    'userid' => 'id',
    'username' => 'username',
    'debug' => false,//confirm this field

   

到这一步,我们的权限模块就可以work了。去检查一下我们的配置是否正常吧,呵呵

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.