rkljw 1 tháng trước cách đây
mục cha
commit
215b1f80fa

+ 23 - 8
.env

@@ -1,16 +1,32 @@
 APP_NAME=admin_consumer
 APP_ENV=dev
-HOST = http://192.168.1.201:9501/
+# HOST = http://192.168.1.201:9501/
+# DB_DRIVER=mysql
+# DB_HOST=127.0.0.1
+# DB_PORT=3306
+# DB_DATABASE=hyperf
+# DB_USERNAME=root
+# DB_PASSWORD=root123
+# DB_CHARSET=utf8mb4
+# DB_COLLATION=utf8mb4_unicode_ci
+# DB_PREFIX=
+
+
+
+HOST = http://192.168.1.123:13306/
+
+
 DB_DRIVER=mysql
-DB_HOST=127.0.0.1
-DB_PORT=3306
+DB_HOST=192.168.1.123
+DB_PORT=13306
 DB_DATABASE=hyperf
 DB_USERNAME=root
-DB_PASSWORD=root123
+DB_PASSWORD=zxt_mysql_dev
 DB_CHARSET=utf8mb4
 DB_COLLATION=utf8mb4_unicode_ci
 DB_PREFIX=
 
+
 #REDIS_HOST=101.254.114.211
 #REDIS_AUTH=YPWWnFnNebc7427B
 #REDIS_PORT=26739
@@ -28,15 +44,14 @@ REDIS_PORT=26739
 REDIS_PASSWORD=zxt_redis_dev
 REDIS_DB=0
 
+
+
 AMQP_HOST=192.168.1.123
 AMQP_PORT=5672
 AMQP_USER=rabbitmq
 AMQP_PASSWORD=zxt_mq_dev
 
-# AMQP_HOST=103.105.201.2
-# AMQP_PORT=5673
-# AMQP_USER=rabbitmq
-# AMQP_PASSWORD=H8eDTAk6LY7EjJ8y
+
 
 
 #小程序获取openid

+ 17 - 2
app/Controller/IndexController.php

@@ -58,10 +58,25 @@ class IndexController extends AbstractController
         //重写验证码
         $result = $code->DrawCode((string)$img_code);
         $img_code = $result->getImageCode();
+        $code_uniqid = uniqid("code");
         //写入缓存 用于其他方法验证 并且设置过期时间
-        $redis->set('code'.$ip,$img_code,60000);
-        return $result?Result::success($result->getImageBase64()):Result::error('失败');
+        $redis->set($code_uniqid,$img_code,60000);
+
+        return $result?Result::success(['code'=>$code_uniqid,'img'=>$result->getImageBase64()]):Result::error('失败');
 //        return $result->getImageBase64();
 
     }
+
+// test
+      /**
+     * 获取验证码
+     */
+    public function getverifyCode(){
+        $comm = new CommonService();
+        $ip = $comm->userIp();
+        $redis = $this->container->get(\Hyperf\Redis\Redis::class);
+        $img_code  =  $redis->get('code'.$ip);
+        return Result::success($img_code);
+    }
+
 }

+ 72 - 16
app/Controller/LoginController.php

@@ -6,12 +6,13 @@ use App\JsonRpc\UserServiceInterface;
 use App\Tools\CommonService;
 use App\Tools\PublicData;
 use App\Tools\Result;
+use Hyperf\Context\Context;
 use function Hyperf\Support\env;
 use Hyperf\Di\Annotation\Inject;
 use Hyperf\HttpServer\Annotation\AutoController;
 use Hyperf\Validation\Contract\ValidatorFactoryInterface;
 use \Phper666\JWTAuth\JWT;
-
+use App\Model\UserToken;
 /**
  * @AutoController()
  */
@@ -28,8 +29,6 @@ class LoginController extends AbstractController
     private $userServiceClient;
     public function login(Jwt $jwt)
     {
-        var_dump("我要登陆了");
-//        $this->logger->info("验证之前");
 
         $reqData = $this->request->all();
         $validator = $this->validationFactory->make(
@@ -38,11 +37,13 @@ class LoginController extends AbstractController
                 'username' => 'required',
                 'password' => 'required',
                 'type' => 'required',
+                'code' => 'required',
             ],
             [
                 'username.required' => '用户名不能为空',
                 'password.required' => '密码不能为空',
                 'type.required' => '登录方式必填',
+                'code.required' => 'code方式必填',
             ]
         );
 
@@ -50,58 +51,92 @@ class LoginController extends AbstractController
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
-        $comm = new CommonService();
-        $ip = $comm->userIp();
+//        $comm = new CommonService();
         $redis = $this->container->get(\Hyperf\Redis\Redis::class);
-        $code = $redis->get('code' . $ip);
+        $code = $redis->get($reqData['code']);
         if (empty($code)) {
             return Result::error("验证码已过期");
         }
-        var_dump("验证码:", $code);
-        var_dump((strtolower($code) . strtolower($reqData['captcha'])));
+
         if (strtolower($code) != strtolower($reqData['captcha'])) {
             return Result::error("验证码错误");
         }
-        //$reqData
         $where = [];
         if ($reqData['type'] == 1) { //密码登录
             $where = [
                 'user_name' => $reqData['username'],
             ];
         }
-//        $this->logger->info("验证之前");
+
         $userInfos = $this->userServiceClient->verifyUserInfo($where);
         if ($userInfos['code'] == 0) {
             return Result::error("用户不存在");
         }
-//        var_dump("数据:",$userInfos);
+
         if($userInfos['data']['status']==0){
             return Result::error("用户已经冻结");
         }
-//        var_dump("用户信息:", $userInfos);
-//        $this->logger->info("验证用户返回值:", $userInfos);
+
         if (md5(md5($reqData['password']) . $userInfos['data']['salt']) != $userInfos['data']['password']) {
             return Result::error("登陆密码错误");
         }
+        if($userInfos['data']['type_id']!=10000){
+            $authData = [
+
+                'id'=>$userInfos['data']['sszq'],
+                'SiteId'=>Context::get("SiteId")
+            ];
+            var_dump("参数:",$authData);
+           $resultAuth =  $this->checkUserAuth($authData);
+
+           if(!$resultAuth){
+               return Result::error("您没有权限登陆此网站");
+           }
+        }
         $userData = [
             'uid' => $userInfos['data']['id'], // 如果使用单点登录,必须存在配置文件中的sso_key的值,一般设置为用户的id
             'user_name' => $userInfos['data']['user_name'],
             'mobile' => $userInfos['data']['mobile'],
             'email' => $userInfos['data']['email'],
-            // 'rong_token' => $userInfos['data']['rong_token'],
             'level_id' => $userInfos['data']['level_id'],
             'type_id' => $userInfos['data']['type_id'],
         ];
-//        var_dump($userData);
         // 使用默认场景登录
         $token = $jwt->getToken('default', $userData);
+        // 检查是否有旧的token
+        $old_token = UserToken::where('user_id', $userData['uid'])->first();
+        if (!empty($old_token)) {
+                $jwt->logout($old_token->token);
+                try {
+                    $jwt->verifyToken($old_token->token);
+                }catch (\Exception $exception){
+                    $code = $exception->getCode();
+                    if ($code== 400) {
+                        $new_token = UserToken::where('user_id', $userData['uid'])->update(['token' => $token->toString()]);
+                        if (empty($new_token)) {
+                            return Result::error("Token过期失败!");
+                        }
+                        
+                    } else{
+                        return Result::error("Token过期失败!");
+                    }
+                }
+        }else{
+            $usernew_token = $token->toString();
+            $user_token =  UserToken::create([
+                'user_id' => $userData['uid'],
+                'token' => $usernew_token
+            ]);
+            if (empty($user_token)) {
+                return Result::error("登录失败!");
+            }
+        }
         $data = [
             'token' => $token->toString(),
             'exp' => $jwt->getTTL($token->toString()),
         ];
         return Result::success($data);
     }
-
     /**
      * @return void
      */
@@ -281,4 +316,25 @@ class LoginController extends AbstractController
         var_dump($h['token'][0], "+++++++++++", $arr, "===####");
         return $this->response->json(['code' => 0, 'msg' => 'success', 'data' => ['a' => 1]]);
     }
+
+    /**
+     * 检测用户权限
+     * @return void
+     */
+    public function checkUserAuth($data)
+    {
+        $websiteGroup = [
+            'id'=>$data['id']
+        ];
+        $result = $this->userServiceClient->getWebsiteGroupInfo($websiteGroup);
+        if($result['code']==200){
+            if($data['SiteId'] && $result['data']['web_ids']){
+                if(in_array($data['SiteId'],json_decode($result['data']['web_ids'],true))){
+                    return true;
+                }
+            }else{
+                return false;
+            }
+        }
+    }
 }

+ 8 - 0
app/JsonRpc/UserService.php

@@ -173,4 +173,12 @@ class UserService extends AbstractServiceClient implements UserServiceInterface
     public function updateUserAvatarNickname(array $data){
         return $this->__request(__FUNCTION__, $data); 
     }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getWebsiteGroupInfo(array $data){
+        return $this->__request(__FUNCTION__, $data);
+    }
 }

+ 6 - 0
app/JsonRpc/UserServiceInterface.php

@@ -114,4 +114,10 @@ interface UserServiceInterface
     public function resetPassword(array $data);
     public function updateUserAvatarNickname(array $data);
 
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteGroupInfo(array $data);
+
 }

+ 26 - 2
app/Middleware/Auth/FooMiddleware.php

@@ -4,6 +4,7 @@ declare(strict_types=1);
 
 namespace App\Middleware\Auth;
 
+use Hyperf\Di\Annotation\Inject;
 use Hyperf\HttpServer\Contract\RequestInterface;
 use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
 use Psr\Container\ContainerInterface;
@@ -12,7 +13,7 @@ use Psr\Http\Message\ServerRequestInterface;
 use Psr\Http\Server\MiddlewareInterface;
 use Psr\Http\Server\RequestHandlerInterface;
 use Hyperf\Context\Context;
-
+use App\JsonRpc\WebsiteServiceInterface;
 use Phper666\JWTAuth\JWT;
 class FooMiddleware implements MiddlewareInterface
 {
@@ -22,7 +23,11 @@ class FooMiddleware implements MiddlewareInterface
 
     protected HttpResponse $response;
     protected JWT $JWT;
-
+    /**
+     * @var WebsiteServiceInterface
+     */
+    #[Inject]
+    private $websiteServiceClient;
     public function __construct(ContainerInterface $container, HttpResponse $response, RequestInterface $request,Jwt $JWT)
     {
         $this->container = $container;
@@ -50,6 +55,25 @@ class FooMiddleware implements MiddlewareInterface
                        ]
                    );
                 }
+                if($header['userurl'][0]){
+                    $origin = $header['userurl'][0];
+                    $data = [
+                        'website_url'=>$origin
+                    ];
+
+                    $result = $this->websiteServiceClient->getWebsiteId($data);
+                    if(!isset($result['data']['id']) || !$result['data']['id']){
+                        return $this->response->json(
+                            [
+                                'code' => -1,
+                                'data' => [],
+
+                                'message' => '网站不存在...',
+                            ]
+                        );
+                    }
+                    Context::set("SiteId",$result['data']['id']);
+                }
 //                var_dump("中间件:",$ver);
                 Context::set("UserId",$ver['uid']);
                 Context::set("TypeId",$ver['type_id']);

+ 91 - 0
app/Middleware/Auth/PublicMiddleware.php

@@ -0,0 +1,91 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Middleware\Auth;
+
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Contract\RequestInterface;
+use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
+use Psr\Container\ContainerInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\MiddlewareInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+use Hyperf\Context\Context;
+use App\JsonRpc\WebsiteServiceInterface;
+use Phper666\JWTAuth\JWT;
+class PublicMiddleware implements MiddlewareInterface
+{
+    protected ContainerInterface $container;
+
+    protected RequestInterface $request;
+
+    protected HttpResponse $response;
+    protected JWT $JWT;
+    /**
+     * @var WebsiteServiceInterface
+     */
+    #[Inject]
+    private $websiteServiceClient;
+    public function __construct(ContainerInterface $container, HttpResponse $response, RequestInterface $request,Jwt $JWT)
+    {
+        $this->container = $container;
+        $this->response = $response;
+        $this->request = $request;
+        $this->JWT = $JWT;
+
+    }
+
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
+    {
+
+        $header = $request->getHeaders();
+        try {
+          
+            if($header &&  isset($header['userurl']) && $header['userurl'][0]!='null' && isset($header['userurl'][0])){
+                $origin = $header['userurl'][0];
+                $data = [
+                    'website_url'=>$origin
+                ];
+
+                $result = $this->websiteServiceClient->getWebsiteId($data);
+                if(!isset($result['data']['id']) || !$result['data']['id']){
+                    return $this->response->json(
+                        [
+                            'code' => -1,
+                            'data' => [],
+
+                            'message' => '网站不存在...',
+                        ]
+                    );
+                }
+//                var_dump($result['data']);
+                // var_dump("获取站点id:",$result);
+                Context::set("SiteId",$result['data']['id']);
+                if ($result) {
+                    return $handler->handle($request);
+                }
+            }else{
+                return $this->response->json(
+                    [
+                        'code' => -1,
+                        'data' => [],
+                        'message' => 'userurl:必填',
+                    ]
+                );
+            }
+
+        }catch (\Exception $e){
+//            var_dump("错误消息:",$e->getMessage(),$e->getCode());
+            return $this->response->json(
+                [
+                    'code' => $e->getCode(),
+                    'data' => [],
+                    'message' => 'userurl必填:'.$e->getMessage(),
+                ]
+            );
+        }
+        return false;
+    }
+}

+ 30 - 0
app/Model/UserToken.php

@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Model;
+
+use Hyperf\DbConnection\Model\Model;
+
+/**
+ */
+class UserToken extends Model
+{
+    /**
+     * The table associated with the model.
+     */
+    protected ?string $table = 'user_token';
+
+    /**
+     * The attributes that are mass assignable.
+     */
+    protected array $fillable = [
+        'user_id', // 添加 user_id 到 fillable 属性
+        'token',
+    ];
+
+    /**
+     * The attributes that should be cast to native types.
+     */
+    protected array $casts = [];
+}

+ 8 - 2
config/api/login.php

@@ -2,8 +2,14 @@
 
 declare (strict_types = 1);
 use Hyperf\HttpServer\Router\Router;
-Router::post('/api/login', 'App\Controller\LoginController@login');
-Router::post('/api/checkVerifyCode', 'App\Controller\LoginController@checkVerifyCode');
+Router::addGroup(
+    '/api', function () {
+        Router::post('/login', 'App\Controller\LoginController@login');
+    },
+    ['middleware' => [\App\Middleware\Auth\PublicMiddleware::class]]
+);
 
+Router::post('/api/checkVerifyCode', 'App\Controller\LoginController@checkVerifyCode');
+Router::addRoute(['GET', 'POST'], '/getverifyCode', 'App\Controller\IndexController@getverifyCode');
 Router::post('/api/registerOrLogin', 'App\Controller\LoginController@registerOrLogin');
 Router::post('/api/getToken', 'App\Controller\LoginController@getToken');