Yii-rights は、標準的な yii-rbac のラッパーです。権限モジュールには、RBAC 用の Web インターフェイスがあります。AuthItem (権限 Web インターフェイスでの操作) を作成するときに、独自のビジネス ルールを定義できます。
AuthItem を作成するためのコードは次のとおりです。
$item = $this->_authorizer->createAuthItem($formModel->name, $type, $formModel->description, $formModel->bizRule, $formModel->data);
$item = $this->_authorizer->attachAuthItemBehavior($item);
_authorizer
RAuthorizer クラスの例を次に示します。次に、CDbAuthManager を拡張する RDbAuthManager に移動し、AuthItem 関数を作成します。
public function createAuthItem($name,$type,$description='',$bizRule=null,$data=null)
{
$this->db->createCommand()
->insert($this->itemTable, array(
'name'=>$name,
'type'=>$type,
'description'=>$description,
'bizrule'=>$bizRule,
'data'=>serialize($data)
));
return new CAuthItem($this,$name,$type,$description,$bizRule,$data);
}
これがAuthItemの作成方法です。個人的には、Web インターフェイスを使用することを好みます。多くの優れた機能があり、処理がはるかに簡単で、毎回コードに移動します。
次に、AuthItem を実行するときに、checkAccess()
execute bizRule を呼び出します。
public function executeBizRule($bizRule,$params,$data)
{
return $bizRule==='' || $bizRule===null || ($this->showErrors ? eval($bizRule)!=0 : @eval($bizRule)!=0);
}
これが yii の RBAC の仕組みであり、rights はそのクールなラッパーにすぎません。権利は、物事がどのように行われなければならないかという論理を変えるものではありません。
したがって、基本的な yii-rbac で、所有レコードのみの更新を許可する場合は、次のようにします。
$bizRule='return Yii::app()->user->id==$params["user"]->username;';
$task=$auth->createTask('updateOwnUser','update a your own account',$bizRule);
$task->addChild('updateUser');
次に、次のように呼び出します。
$user=$this->loadUser();
$params = array('user' => $user);
if(Yii::app()->user->checkAccess('updateOwnUser', $params){
..................
}
権利では、すでにフィルターで実装されています。あなたがする必要があるのは、コントローラーに追加することだけです:
class MyController extends RController{
.............
public function filters()
{
return array(
'rights',
............
);
}
.............
}
したがって、Web インターフェイスでアイテムのビズルールを定義し、コントローラー コードを変更するだけです。bizrule で使用する変数を知るには、checkAccess() が実行された RightsFilter.php コードを監視します。
そして、これに加えて、checkAccess() がどのように機能するかについて説明します。
ユーザーに割り当てられた認証項目ごとに、最初に割り当ての bizRule が true を返すかどうかを確認します。
true の場合、アイテムの checkAccess メソッドを呼び出します。アイテムのbizRuleがtrueを返す場合、
2.1. 項目名が元の checkAccess() メソッドで渡された名前と同じ場合、true を返します。
2.2. それ以外の場合は、子項目ごとにその checkAccess を呼び出します。
これが RBAC のいくつかの側面を明確にし、あなたの仕事に役立つことを願っています。