Controller.php 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. /**
  3. * Controller is the customized base controller class.
  4. * All controller classes for this application should extend from this base class.
  5. */
  6. class Controller extends CController
  7. {
  8. /**
  9. * @var string the default layout for the controller view. Defaults to '//layouts/column1',
  10. * meaning using a single column layout. See 'protected/views/layouts/column1.php'.
  11. */
  12. public $layout='//layouts/column1';
  13. /**
  14. * 检查请求方是否合法
  15. * @return void
  16. * @throws CHttpException
  17. */
  18. private function _checkRequest(): void
  19. {
  20. if (LWM_ENV == 'dev') {
  21. header("Access-Control-Allow-Origin: *");
  22. } else {
  23. if (!str_contains(Yii::app()->request->hostInfo, Yii::app()->params['url'])) {
  24. throw new CHttpException(403, '非法访问');
  25. }
  26. header("Access-Control-Allow-Origin:" . Yii::app()->request->hostInfo);
  27. }
  28. header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
  29. header("Access-Control-Allow-Headers: Content-Type, Authorization, Cookie");
  30. if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
  31. exit(0); // 预检请求直接返回
  32. }
  33. }
  34. private function _checkSign()
  35. {
  36. if (!\Yii::app()->request->isPostRequest) {
  37. return true;
  38. }
  39. if (!isset($_POST['sign'])) {
  40. return false;
  41. }
  42. $paramArray = [];
  43. unset($paramArray['sign']); // 签名不计算sign
  44. $stringArray = []; // 对参与签名的参数进行排序
  45. foreach ($_POST as $k => $v) {
  46. $stringArray[] = "{$k}={$v}";
  47. }
  48. sort($stringArray, SORT_STRING);
  49. $query = implode('&', $stringArray) . 'v1wqe21wmjhop';
  50. $sign = strtoupper(hash('sha256', $query));
  51. Logger::errorMult($query, $sign, $sign == $_POST['sign']);
  52. return $_POST['sign'] == $sign;
  53. }
  54. /**
  55. * @throws CHttpException
  56. */
  57. public function beforeAction($action): bool
  58. {
  59. $this->_checkRequest();
  60. Yii::app()->language = 'zh_cn';
  61. $controller = Yii::app()->controller->id;
  62. $action = $this->getAction()->getId();
  63. $path = strtolower($controller . '/'. $action);
  64. if( !in_array($controller, ['site'])
  65. &&!in_array($path, LewaimaiAdminPingtaiAuth::$noLoginRouters)
  66. && Yii::app()->user->isGuest
  67. ){
  68. Helper::error('请先登入', 401);
  69. }
  70. if (!LewaimaiAdminPingtaiAuth::adminAuth($controller, $action)
  71. && (!Yii::app()->user->isGuest && Yii::app()->user->_id != 1)
  72. ) {
  73. Helper::error('您没有相应的权限');
  74. }
  75. return true;
  76. }
  77. }