Commit dec38df7 by haojie

1

parent a227bf50
File added
......@@ -3,6 +3,7 @@
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Support\Facades\Log;
use Throwable;
class Handler extends ExceptionHandler
......@@ -37,6 +38,25 @@ class Handler extends ExceptionHandler
];
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Illuminate\Http\Response
*/
public function render($request, Throwable $exception)
{
if ($exception instanceof UserException) {
return $exception::render($request, $exception);
}
if ($exception instanceof \Illuminate\Auth\AuthenticationException) {
$exception = new \App\Exceptions\UserException(0, 'TOKEN失效了', [], 403);
return UserException::render($request, $exception);
}
return parent::render($request, $exception);
}
/**
* Register the exception handling callbacks for the application.
*
* @return void
......
<?php
namespace App\Exceptions;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class UserException extends Exception
{
protected $errors;
protected $status_code;
protected $headers;
protected $data;
public static $errorList = [];
//
public function __construct(int $code = 1, $message = 'error', $errors = [], int $status_code = 400, array $headers = [], array $data = [])
{
parent::__construct();
$code = sprintf("%03d", $code);
$code = ($this->getCodePrefix() . $code);
$this->status_code = $status_code;
$this->code = (int)($code);
$this->message = $this->getDefaultMessage($code, $message);
$this->errors = $errors;
$this->headers = $headers;
$this->data = $data;
}
public function getCodePrefix(): int
{
return 1;
}
public static function invalid($request, $exception)
{
$data = [
'errors' => $exception->errors,
'message' => $exception->getMessage(),
'code' => $exception->getCode(),
'status_code' => $exception->getStatusCode(),
'data' => $exception->getData(),
];
return response()->json($data, $exception->getStatusCode(),
$exception->getHeaders());
}
public function getDefaultMessage($code, $message = '')
{
if (filled($message)) {
return $message;
}
return self::$errorList[$code] ?? ($this->message ?? '');
}
public static function render(Request $request, self $exception)
{
return $request->expectsJson() ? self::invalidJson($exception) : self::invalid($request, $exception);
}
public function getStatusCode(): int
{
return $this->status_code;
}
public function getData()
{
return $this->data;
}
public function getHeaders(): array
{
return $this->headers;
}
/**
* 无效json
*
* @param $exception
* @param string $lang
* @return \Illuminate\Http\JsonResponse
*/
public static function invalidJson(self $exception)
{
$data = [
'errors' => $exception->errors,
'message' => $exception->getMessage(),
'code' => $exception->getCode(),
'status_code' => $exception->getStatusCode(),
'data' => $exception->getData(),
];
if (app()->environment(['local'])) {
$data['trace'] = $exception->getTrace();
$data['time'] = microtime(true) - LARAVEL_START;
}
return response()->json($data, $exception->getStatusCode(),
$exception->getHeaders());
}
}
<?php
namespace App\Http\Controllers\API\User;
use App\Exceptions\UserException;
use App\Http\Controllers\Controller;
use App\Models\UseUser;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\Request;
class AuthController extends Controller
{
public function login(Request $request)
{
$data = $request->input();
if (empty($data['address'])) {
return $this->error('缺少数据', 400);
}
# 登录
$result = self::LoginEvent($data);
return $this->success('success', $result);
}
public function logout()
{
return '';
}
public function LoginEvent(array $data = [])
{
$credentials = Arr::only($data, ['address']);
$address = $credentials['address'] ?? '';
$UserInfo = UseUser::where('user_address', $address)->first();
if (blank($UserInfo)) {
throw new UserException(1, '账号不存在');
}
$token = auth('api')->login($UserInfo);
return [
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => auth('api')->factory()->getTTL() * 60
];
}
public function getlist()
{
return 123;
}
}
<?php
namespace App\Models\Traits;
trait SerializeDate
{
/**
* 为数组 / JSON序列化准备一个日期
*
* @param \DateTimeInterface $date
* @return string
*/
protected function serializeDate(\DateTimeInterface $date)
{
return $date->format('Y-m-d H:i:s');
}
}
......@@ -2,18 +2,33 @@
namespace App\Models;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use App\Models\Traits\SerializeDate;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use PHPOpenSourceSaver\JWTAuth\Contracts\JWTSubject;
use Illuminate\Database\Eloquent\Model;
class UseUser extends Model
class UseUser extends Authenticatable implements JWTSubject
{
use HasDateTimeFormatter;
use HasApiTokens, HasFactory, Notifiable, SerializeDate;
protected $fillable = [
'user_address',
'invitation_code'
];
// 实现下面两个方法
public function getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims()
{
return [];
}
protected $table = 'use_user';
}
......@@ -12,8 +12,10 @@
"dcat/laravel-admin": "2.2.2-beta",
"guzzlehttp/guzzle": "^7.2",
"laravel/framework": "^9.19",
"laravel/passport": "^11.8",
"laravel/sanctum": "^3.0",
"laravel/tinker": "^2.7"
"laravel/tinker": "^2.7",
"php-open-source-saver/jwt-auth": "^2.1"
},
"require-dev": {
"fakerphp/faker": "^1.9.1",
......
......@@ -40,6 +40,10 @@
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'jwt',
'provider' => 'use_user',
],
],
/*
......@@ -61,14 +65,13 @@
'providers' => [
'users' => [
'driver' => 'database',
'table' => 'users',
],
'use_user' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
'model' => App\Models\UseUser::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
/*
......
......@@ -44,4 +44,26 @@
# 测试
# Route::get('/my/test', 'IndexController@useMyTest');
# 用户
Route::group([
'prefix' => '/user',
'namespace' => 'User'
], function () {
// 不需要登录
Route::group([
], function () {
// 用户登录
Route::post('login', 'AuthController@login');
});
// 需要登录
Route::group([
'middleware' => 'auth:api',
], function () {
# 测试数据获取
Route::get('getlist', 'AuthController@getlist');
// 管理员退出
Route::post('logout', 'AuthController@logout');
});
});
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment