权限验证

框架中提供了一套完整的权限验证逻辑,可对路由下所有method进行权限验证

用户需要在action中添加privilege方法,具体返回字段如下

  1. class testAction extends baseAction
  2. {
  3. private $key = 'test';
  4.  
  5. protected function privilege()
  6. {
  7. return array(
  8. // 登录验证(在privilegeService中定义)
  9. 'login_required' => array(
  10. 'actions' => '*', // 绑定action,*为所有method
  11. 'params' => [], // 传参(能获取到$this,不用另外传)可不传
  12. 'callBack' => [], // 验证失败回调函数, 可不传
  13. ),
  14. 'my_required' => array(
  15. 'actions' => ['index'], // 对action_index进行验证
  16. 'params' => [$this->key], // 传参
  17. 'callBack' => [$this, 'test'], // 验证失败后调用$this->test()
  18. ),
  19. );
  20. }
  21. // 根据逻辑被调用前会分别进行login_required和my_required验证,都成功后进入该方法
  22. public function action_index()
  23. {
  24. // do something
  25. }
  26. // my_required验证失败后调用, $action为验证失败的action(这里是$this)
  27. public function test($action, $error)
  28. {
  29. // do something
  30. }
  31. }

然后在privilegeService中定义验证方法

  1. 第一个参数$actiontestAction$keyparams传入参数
  2. public function my_required($action, $key=NULL)
  3. {
  4. if($key){
  5. // 通过校验
  6. return $this->correct(); // 等同于 return true;
  7. } else {
  8. // 校验失败,错误信息可通过$this->privilegeService->getError()获取
  9. return $this->error('key not exist');
  10. }
  11. }

callBack参数为校验失败时调用的方法,默认不填会抛出错误异常,程序不会再继续执行。

如果需要不同路由都使用同一个验证方法,而分别传入不同参数验证,可以使用requires参数,用法参考下例:

  1. class testAction extends baseAction
  2. {
  3. protected function privilege()
  4. {
  5. return array(
  6. 'privilege_required' => array(
  7. // 根据不同路由传入相应操作权限
  8. 'requires' => [
  9. ['actions'=>['index', 'view'], 'params'=>[Privilege::user]],
  10. ['actions'=>['edit', 'delete'], 'params'=>[Privilege::admin]],
  11. ],
  12. 'callBack' => [$this, 'test'], // 验证失败后调用$this->test()
  13. ),
  14. );
  15. }
  16.  
  17. // privilegeService
  18. public function privilege_required($action, $privilege)
  19. {
  20. if(App::$model->person->hasPrivilege($privilege)){
  21. // 该用户有相应权限
  22. return $this->correct(); // 等同于 return true;
  23. } else {
  24. // 校验失败,错误信息可通过$this->privilegeService->getError()获取
  25. return $this->error('forbidden');
  26. }
  27. }

注意:使用requires参数时,actionsparams参数将被覆盖