Basic.php 5.5 KB

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