Basic.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?php
  2. namespace app\ebapi\controller;
  3. use app\core\behavior\UserBehavior;
  4. use service\HookService;
  5. use app\core\util\TokenService;
  6. use service\JsonService;
  7. use service\UtilService;
  8. use think\Config;
  9. use think\Controller;
  10. use app\ebapi\model\user\User;
  11. use think\Hook;
  12. class Basic extends Controller
  13. {
  14. //是否为调试模式 生产模式下请改为false
  15. protected $Debug=true;
  16. //未使用路由前置执行的行为
  17. protected $ApimiddlewareGroups=[
  18. //取消未支付订单
  19. 'order_unpaid_cancel'=>\app\core\behavior\OrderBehavior::class,
  20. //清除昨日用户生成的附件
  21. 'empty_yester_day_attachment'=>\app\core\behavior\UserBehavior::class,
  22. ];
  23. protected function _initialize()
  24. {
  25. parent::_initialize(); // TODO: Change the autogenerated stub
  26. $this->Debug=Config::get('app_debug');
  27. header("Access-Control-Allow-Origin:*");
  28. header("Access-Control-Allow-Methods:POST,GET");
  29. header("Access-Control-Allow-Headers:*");
  30. $this->runApimiddlewareGroups();
  31. }
  32. /*
  33. * 验证token 正确返回userinfo 失败终止程序运行
  34. * */
  35. protected function checkTokenGetUserInfo()
  36. {
  37. //生产模式非微信内部浏览器禁止访问
  38. if(!UtilService::isWechatBrowser() && $this->Debug===false) return $this->fail('非法访问');
  39. //获取白名单跳过token验证
  40. $check =$this->checkAuth();
  41. //获取token
  42. $token =$this->getRequestToken();
  43. if(!$token && $check===false) $this->fail('请传入token验证您的身份信息');
  44. //验证token
  45. $Tokencheck=TokenService::checkToken($token,$check);
  46. if($Tokencheck===true){
  47. return ['uid'=>0];
  48. }else if(is_array($Tokencheck)){
  49. list($uid)=$Tokencheck;
  50. $userInfo = User::get($uid);
  51. }else $this->fail('没有获取到用户信息,请传入token验证您的身份信息',[],402);
  52. if((!$userInfo || !isset($userInfo)) && $check===false) $this->fail('用户信息获取失败,没有这样的用户!',[],402);
  53. if(isset($userInfo)){
  54. if(!$userInfo->status) $this->fail('您已被禁止登录',[],401);
  55. HookService::listen('init',$userInfo,null,false,UserBehavior::class);
  56. return $userInfo->toArray();
  57. }else return ['uid'=>0];
  58. }
  59. /*
  60. * 没有开启路由时运行行为 开启路由请用路由加载行为
  61. *
  62. * */
  63. protected function runApimiddlewareGroups()
  64. {
  65. $hash=$this->request->routeInfo();
  66. if(!Config::get('url_route_on') || !isset($hash['rule'][1]))
  67. {
  68. foreach ((array)$this->ApimiddlewareGroups as $action=>$behavior){
  69. $result=Hook::exec($behavior,is_string($action) ? $action : '');
  70. if(!is_null($result)) return $this->fail($result);
  71. }
  72. }
  73. }
  74. public function _empty($name)
  75. {
  76. $this->fail('您访问的页面不存在:'.$name);
  77. }
  78. /*
  79. * 获取请求token
  80. * @return string
  81. * */
  82. protected function getRequestToken()
  83. {
  84. //非生产模式允许把token放在url上传输请求
  85. if($this->Debug){
  86. $TOKEN=$this->request->header('token');
  87. }else{
  88. $TOKEN =$this->request->get('token','');
  89. if($TOKEN==='') $TOKEN=$this->request->param('token','');
  90. if($TOKEN==='') $TOKEN=$this->request->header('token');
  91. }
  92. return $TOKEN;
  93. }
  94. /*
  95. * 正确操作返回json
  96. * @param string | array $msg 提示语或者数据
  97. * @param array $data 数据
  98. * @param int $status
  99. * @return json
  100. * */
  101. protected function successful($msg='ok',$data=[],$status=200)
  102. {
  103. return JsonService::successful($msg,$data,$status);
  104. }
  105. /*
  106. * 错误操作返回json
  107. * @param string | array $msg 提示语或者数据
  108. * @param array $data 数据
  109. * @param int $status
  110. * @return json
  111. * */
  112. protected function fail($msg='error',$data=[],$status=400)
  113. {
  114. return JsonService::fail($msg,$data,$status);
  115. }
  116. /*
  117. * 组装路由
  118. * @param string $action 方法
  119. * @param string $controller 控制器
  120. * @param string $module 模块
  121. * @return string
  122. * */
  123. protected function getAuthName($action,$controller,$module)
  124. {
  125. return strtolower($module.'/'.$controller.'/'.$action);
  126. }
  127. /*
  128. * 获取当前的控制器名,模块名,方法名,类名并返回
  129. * @param string $controller 控制器
  130. * @param string $module 模块
  131. * @return string
  132. * */
  133. protected function getCurrentController($controller,$module)
  134. {
  135. return 'app\\'.$module.'\\controller\\'.str_replace('.','\\',$controller);
  136. }
  137. /*
  138. * 校验器 效验白名单方法跳过token验证
  139. * @param string $action 方法名
  140. * @param string $controller 控制器名
  141. * @param string $module 模块名
  142. * @return boolean
  143. * */
  144. protected function checkAuth($action = null,$controller = null,$module = null)
  145. {
  146. //获取当前控制器,模型,方法
  147. if($module === null) $module = $this->request->module();
  148. if($controller === null) $controller = $this->request->controller();
  149. if($action === null) $action = $this->request->action();
  150. //获取当前访问类名全称
  151. $className=$this->getCurrentController($controller,$module);
  152. if(method_exists($className,'whiteList')){
  153. try{
  154. //执行白名单方法获取白名单
  155. $white = $className::whiteList();
  156. if(!is_array($white)) return false;
  157. foreach ($white as $actionWhite){
  158. //比较白名单和当前访问方法
  159. if($this->getAuthName($actionWhite,$controller,$module)==$this->getAuthName($action,$controller,$module))
  160. return true;
  161. }
  162. }catch (\Exception $e){}
  163. }
  164. return false;
  165. }
  166. }