From ee9fd8f447ade343c98ad763323a03ac1e82c96b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9D=99?= Date: Thu, 30 Dec 2021 16:31:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=99=BB=E5=BD=95=E6=B3=A8?= =?UTF-8?q?=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Constants/Device.php | 5 +- .../Http/Controllers/Auth/LoginController.php | 54 ++++++++++++++----- .../Controllers/Auth/RegisterController.php | 8 +-- .../Api/Http/Requests/LoginRequest.php | 31 ----------- app/Endpoint/Api/routes.php | 1 + app/Http/Kernel.php | 1 + app/Models/User.php | 41 +++++--------- app/Models/UserInfo.php | 3 +- ..._index_to_personal_access_tokens_table.php | 32 +++++++++++ ...152224_add_old_password_to_users_table.php | 32 +++++++++++ 10 files changed, 131 insertions(+), 77 deletions(-) delete mode 100644 app/Endpoint/Api/Http/Requests/LoginRequest.php create mode 100644 database/migrations/2021_12_30_095235_add_name_index_to_personal_access_tokens_table.php create mode 100644 database/migrations/2021_12_30_152224_add_old_password_to_users_table.php diff --git a/app/Constants/Device.php b/app/Constants/Device.php index 7696df5a..8df33c8a 100644 --- a/app/Constants/Device.php +++ b/app/Constants/Device.php @@ -4,6 +4,9 @@ namespace App\Constants; class Device { - public const PC = 'pc'; + // 商城 public const UNIAPP = 'uniapp'; + + // 商户端 + public const MERCHANT = 'merchant'; } diff --git a/app/Endpoint/Api/Http/Controllers/Auth/LoginController.php b/app/Endpoint/Api/Http/Controllers/Auth/LoginController.php index 6b1f1819..e5ce4837 100644 --- a/app/Endpoint/Api/Http/Controllers/Auth/LoginController.php +++ b/app/Endpoint/Api/Http/Controllers/Auth/LoginController.php @@ -4,35 +4,61 @@ namespace App\Endpoint\Api\Http\Controllers\Auth; use App\Constants\Device; use App\Endpoint\Api\Http\Controllers\Controller; -use App\Endpoint\Api\Http\Requests\LoginRequest; use App\Exceptions\BizException; use App\Models\User; +use Illuminate\Http\Request; class LoginController extends Controller { /** * 登录 * - * @param \App\Endpoint\Api\Http\Requests\LoginRequest $request + * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\JsonResponse */ - public function __invoke(LoginRequest $request) + public function __invoke(Request $request) { - $user = User::where('phone', $request->input('phone'))->first(); + $validated = $request->validate([ + 'phone' => ['bail', 'required', 'string'], + 'password' => ['bail', 'required', 'string'], + ]); - if (! $user?->verifyPassword($request->input('password'))) { + $user = User::where('phone', $validated['phone'])->first(); + + if (! $user?->verifyPassword($validated['password'])) { throw new BizException(__('Incorrect account or password')); } - $user->update([ - 'last_login_at' => now(), - 'last_login_ip' => $request->realIp(), + if ($user->old_password) { + $user->password = $validated['password']; + $user->old_password = null; + } + $user->last_login_at = now(); + $user->last_login_ip = $request->realIp(); + $user->save(); + + // 获取登录设备 + $device = $request->header('client-app', Device::UNIAPP); + + switch ($device) { + case Device::MERCHANT: + // 清理此用户的商户端令牌 + $user->tokens()->where('name', $device)->delete(); + // 颁发新的商户端令牌 + $token = $user->createToken($device); + break; + + default: + $device = Device::UNIAPP; + // 清理此用户的商城端令牌 + $user->tokens()->where('name', $device)->delete(); + // 颁发新的商城端令牌 + $token = $user->createToken($device, ['mall']); + break; + } + + return response()->json([ + 'token' => $token->plainTextToken, ]); - - $user->tokens()->delete(); - - return response()->json( - $user->createDeviceToken(Device::UNIAPP) - ); } } diff --git a/app/Endpoint/Api/Http/Controllers/Auth/RegisterController.php b/app/Endpoint/Api/Http/Controllers/Auth/RegisterController.php index fd9e8fc2..01516ed9 100644 --- a/app/Endpoint/Api/Http/Controllers/Auth/RegisterController.php +++ b/app/Endpoint/Api/Http/Controllers/Auth/RegisterController.php @@ -59,9 +59,11 @@ class RegisterController extends Controller throw new BizException(__('Registration failed, please try again')); } - return response()->json( - $user->createDeviceToken(Device::UNIAPP) - ); + $token = $user->createToken(Device::UNIAPP, ['mall']); + + return response()->json([ + 'token' => $token->plainTextToken, + ]); } /** diff --git a/app/Endpoint/Api/Http/Requests/LoginRequest.php b/app/Endpoint/Api/Http/Requests/LoginRequest.php deleted file mode 100644 index d68e95a2..00000000 --- a/app/Endpoint/Api/Http/Requests/LoginRequest.php +++ /dev/null @@ -1,31 +0,0 @@ - ['bail', 'required', 'string'], - 'password' => ['bail', 'required', 'string'], - ]; - } -} diff --git a/app/Endpoint/Api/routes.php b/app/Endpoint/Api/routes.php index 64d99496..1a71919c 100644 --- a/app/Endpoint/Api/routes.php +++ b/app/Endpoint/Api/routes.php @@ -179,6 +179,7 @@ Route::group([ 'prefix' => 'merchant', 'middleware' => [ 'guard:api', + 'ability:merchant', ], ], function () { Route::get('account', [Merchant\UserController::class, 'account']); diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 2013305b..151efce0 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -65,5 +65,6 @@ class Kernel extends HttpKernel 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'admin.permissions' => \App\Admin\Middleware\Permissions::class, + 'ability' => \Laravel\Sanctum\Http\Middleware\CheckForAnyAbility::class, ]; } diff --git a/app/Models/User.php b/app/Models/User.php index bca574a0..af43ca5f 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -2,7 +2,6 @@ namespace App\Models; -use App\Constants\Device; use Dcat\Admin\Traits\HasDateTimeFormatter; use Illuminate\Auth\Authenticatable; use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract; @@ -12,6 +11,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Foundation\Auth\Access\Authorizable; use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Str; use Laravel\Sanctum\HasApiTokens; class User extends Model implements AuthorizableContract, AuthenticatableContract @@ -330,20 +330,12 @@ class User extends Model implements AuthorizableContract, AuthenticatableContrac */ public function verifyPassword(string $password): bool { - return $this->password && Hash::check($password, $this->password); - } + // 如果旧密码存在,则校验旧密码 + if ($this->old_password) { + return $this->old_password === md5($password); + } - /** - * 创建设备授权令牌 - * - * @param string $device - * @return array - */ - public function createDeviceToken(string $device = null): array - { - return [ - 'token' => $this->createToken($device ?: Device::PC)->plainTextToken, - ]; + return $this->password && Hash::check($password, $this->password); } /** @@ -357,24 +349,19 @@ class User extends Model implements AuthorizableContract, AuthenticatableContrac { $user = static::query()->create($attributes); - $user->userInfo()->create( - $inviter ? [ - 'inviter_id' => $inviter->id, - 'depth' => $inviter->userInfo->depth + 1, - 'path' => $inviter->userInfo->path.$inviter->id.'/', - ] : [ - 'inviter_id' => null, - 'depth' => 1, - 'path' => '/', - ] - ); + // 邀请人的深度 + $depth = (int) $inviter?->userInfo?->depth; + + $user->userInfo()->create([ + 'inviter_id' => $inviter?->id, + 'depth' => $depth + 1, + 'path' => Str::finish($inviter?->userInfo?->full_path, '/'), + ]); //初始化钱包 $user->wallet()->create(); //初始化余额 $user->balance()->create(); - //初始化绑定的银行卡 - $user->bank()->create(); return $user; } diff --git a/app/Models/UserInfo.php b/app/Models/UserInfo.php index ea2b02ec..7fd75a7d 100644 --- a/app/Models/UserInfo.php +++ b/app/Models/UserInfo.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Helpers\Str as StrHelper; use Dcat\Admin\Traits\HasDateTimeFormatter; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; @@ -126,7 +127,7 @@ class UserInfo extends Model // 如果没有邀请码,则自动分配邀请码 if ($userInfo->code === null) { do { - $userInfo->code = strtolower(Str::randomAlpha(6)); + $userInfo->code = strtolower(StrHelper::randomAlpha(6)); } while (static::where('code', $userInfo->code)->exists()); } elseif ($userInfo->isDirty('code')) { $userInfo->code = strtolower($userInfo->code); diff --git a/database/migrations/2021_12_30_095235_add_name_index_to_personal_access_tokens_table.php b/database/migrations/2021_12_30_095235_add_name_index_to_personal_access_tokens_table.php new file mode 100644 index 00000000..c9acb9ed --- /dev/null +++ b/database/migrations/2021_12_30_095235_add_name_index_to_personal_access_tokens_table.php @@ -0,0 +1,32 @@ +index('name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('personal_access_tokens', function (Blueprint $table) { + $table->dropIndex(['name']); + }); + } +} diff --git a/database/migrations/2021_12_30_152224_add_old_password_to_users_table.php b/database/migrations/2021_12_30_152224_add_old_password_to_users_table.php new file mode 100644 index 00000000..b54244ab --- /dev/null +++ b/database/migrations/2021_12_30_152224_add_old_password_to_users_table.php @@ -0,0 +1,32 @@ +string('old_password')->nullable()->comment('旧密码'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn(['old_password']); + }); + } +}