BaseController.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?php
  2. namespace backend\controllers;
  3. use backend\models\AdminRole;
  4. use common\enums\AppEnum;
  5. use common\enums\StatusEnum;
  6. use common\helpers\Auth;
  7. use common\models\rbac\AuthItem;
  8. use common\models\rbac\AuthItemChild;
  9. use common\traits\BaseControllerTrait;
  10. use yii\web\Controller;
  11. use yii\filters\VerbFilter;
  12. use yii\filters\AccessControl;
  13. use common\traits\ErrorTrait;
  14. use Yii;
  15. use yii\web\ForbiddenHttpException;
  16. /**
  17. * Site controller
  18. */
  19. class BaseController extends Controller
  20. {
  21. public $enableCsrfValidation = false;
  22. public $pageSize = 20;
  23. use ErrorTrait;
  24. use BaseControllerTrait;
  25. /**
  26. * {@inheritdoc}
  27. */
  28. public function behaviors()
  29. {
  30. $url = Yii::$app->getRequest()->getAbsoluteUrl();
  31. $url_pre = Yii::$app->services->setting->platform->get('system.backend_url').'/index.php?r=admin';
  32. if(strpos($url,$url_pre)!==false)\Yii::$app->user->loginUrl = ['admin/auth/login','login_type'=>Yii::$app->params['login_type']];
  33. return [
  34. 'access' => [
  35. 'class' => AccessControl::class,
  36. 'rules' => [
  37. [
  38. 'allow' => true,
  39. 'roles' => ['@'],
  40. ],
  41. ],
  42. ],
  43. ];
  44. }
  45. public function beforeAction($action)
  46. {
  47. if (!parent::beforeAction($action)) {
  48. return false;
  49. }
  50. // 每页数量
  51. $this->pageSize = Yii::$app->request->get('limit', 20);
  52. $this->pageSize > 50 && $this->pageSize = 50;
  53. // 判断当前模块的是否为主模块, 模块+控制器+方法
  54. $permissionName = Yii::$app->controller->route;
  55. // 判断是否忽略校验
  56. if (in_array($permissionName, Yii::$app->params['noAuthRoute'])) {
  57. return true;
  58. }
  59. // 开始权限校验 add 添加overview验证
  60. //if($permissionName !='mall/overview/index'){
  61. if (!Auth::verify($permissionName)) {
  62. if($this->request->isAjax){
  63. return $this->error('对不起,您现在还没获此操作的权限');
  64. }else{
  65. $user_identity = Yii::$app->user->identity;
  66. if(empty($user_identity)) return $this->redirect(['/admin/auth/login','login_type'=>base64_encode('mall')]);
  67. if(!empty($user_identity->mall_id)){
  68. $route = $this->getAdminCanRoute($user_identity);
  69. $redirect_url = \Yii::$app->urlManager->createAbsoluteUrl($route??'');
  70. return $this->redirect($redirect_url);
  71. }
  72. throw new ForbiddenHttpException('对不起,您现在还没获此操作的权限');
  73. }
  74. }
  75. //}
  76. return true;
  77. }
  78. /**
  79. * 获取当前管理员可访问的1级路由
  80. * @param $user_identity
  81. * @return mixed|string
  82. */
  83. protected function getAdminCanRoute($user_identity){
  84. $role = AdminRole::findOne(['admin_id'=>$user_identity['id']]);
  85. $role_id = $role['role_id'];
  86. $auth_item_list = AuthItem::lists([
  87. 'where'=>[
  88. ['status'=>StatusEnum::ENABLED],
  89. ['pid'=>0],
  90. ['is_addon'=>0],
  91. ['cate_id'=>AppEnum::MALL],
  92. ],
  93. 'select'=>'id,name',
  94. 'index'=>'id'
  95. ]);
  96. $item_ids = array_column($auth_item_list,'id');
  97. $auth_item_child_one = AuthItemChild::getOne([
  98. ['item_id'=>$item_ids],
  99. ['role_id'=>$role_id]],true,[],'item_id asc','item_id'
  100. );
  101. $route = '';
  102. if(!empty($auth_item_child_one['item_id'])){
  103. $route = $auth_item_list[$auth_item_child_one['item_id']]['name']??'';
  104. // 兼容例如 mall/diy的url
  105. if ($route && count(explode('/', $route)) < 3) {
  106. $auths = Auth::getAuth();
  107. $auth_item_list = AuthItem::lists([
  108. 'where'=>[
  109. ['status' => StatusEnum::ENABLED],
  110. ['pid' => $auth_item_child_one['item_id']],
  111. ['is_addon' => 0],
  112. ['cate_id' => AppEnum::MALL],
  113. ],
  114. 'select'=>'name',
  115. ]);
  116. $auth_item_list = array_column($auth_item_list, 'name');
  117. $intersect = array_values(array_intersect($auths, $auth_item_list));
  118. $intersect && $route = $intersect[0];
  119. }
  120. }
  121. return $route;
  122. }
  123. }