login
This commit is contained in:
14
app/Const/Filter.php
Normal file
14
app/Const/Filter.php
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
namespace App\Const;
|
||||
|
||||
class Filter
|
||||
{
|
||||
|
||||
const REQ_LOG_FILTER = [
|
||||
'password',
|
||||
'passwd',
|
||||
'token',
|
||||
'_token',
|
||||
];
|
||||
|
||||
}
|
||||
17
app/Const/RedisConst.php
Normal file
17
app/Const/RedisConst.php
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
namespace App\Const;
|
||||
class RedisConst{
|
||||
|
||||
const COMMON_EXP_TIME = 86400*60;
|
||||
|
||||
const UID_TOKENS = 'UID_TOKENS:';
|
||||
const TOKEN_UID = 'TOKEN_UID:';
|
||||
|
||||
|
||||
|
||||
const ORM_FIND_CACHE_SECOND = 120;
|
||||
|
||||
|
||||
const ORM_CACHE_USER = 'ORM_CACHE_USER:';
|
||||
}
|
||||
|
||||
9
app/Const/Responses.php
Normal file
9
app/Const/Responses.php
Normal file
@ -0,0 +1,9 @@
|
||||
<?php
|
||||
namespace App\Const;
|
||||
|
||||
class Responses{
|
||||
|
||||
const CODE_SUCCESS = 200;
|
||||
const CODE_ERROR = 10000;
|
||||
|
||||
}
|
||||
39
app/Http/Controllers/Base/BaseController.php
Normal file
39
app/Http/Controllers/Base/BaseController.php
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Base;
|
||||
|
||||
use App\Const\Responses;
|
||||
use Illuminate\Routing\Controller;
|
||||
|
||||
class BaseController extends Controller
|
||||
{
|
||||
public array $validateMethodParams = [];
|
||||
|
||||
function __call($method, $parameters)
|
||||
{
|
||||
if (isset($this->validateMethodParams[$method])) {
|
||||
request()->validate($this->validateMethodParams[$method]);
|
||||
}
|
||||
parent::__call($method, $parameters);
|
||||
}
|
||||
|
||||
function reply($code, $msg, $data = []): \Illuminate\Http\JsonResponse
|
||||
{
|
||||
return response()->json([
|
||||
'code' => $code,
|
||||
'msg' => $msg,
|
||||
'data' => $data,
|
||||
]);
|
||||
}
|
||||
|
||||
function success($data = []): \Illuminate\Http\JsonResponse
|
||||
{
|
||||
return $this->reply(Responses::CODE_SUCCESS, 'success', $data);
|
||||
}
|
||||
|
||||
function error($msg = 'error', $data = []): \Illuminate\Http\JsonResponse
|
||||
{
|
||||
return $this->reply(Responses::CODE_ERROR, $msg, $data);
|
||||
}
|
||||
|
||||
}
|
||||
7
app/Http/Controllers/Base/CustomerBaseController.php
Normal file
7
app/Http/Controllers/Base/CustomerBaseController.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers\Base;
|
||||
|
||||
class CustomerBaseController extends BaseController
|
||||
{
|
||||
|
||||
}
|
||||
@ -1,12 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||
use Illuminate\Routing\Controller as BaseController;
|
||||
|
||||
class Controller extends BaseController
|
||||
{
|
||||
use AuthorizesRequests, ValidatesRequests;
|
||||
}
|
||||
108
app/Http/Controllers/Customer/CustomerUserController.php
Normal file
108
app/Http/Controllers/Customer/CustomerUserController.php
Normal file
@ -0,0 +1,108 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers\Customer;
|
||||
|
||||
use App\Http\Controllers\Base\CustomerBaseController;
|
||||
use App\Models\Customer\CustomerUser;
|
||||
use App\Service\AuthService;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Support\ValidatedInput;
|
||||
|
||||
class CustomerUserController extends CustomerBaseController
|
||||
{
|
||||
public array $validateMethodParams = [
|
||||
'signIn' => [
|
||||
'username' => 'required|alpha_dash:ascii|max:50',
|
||||
'password' => 'required|alpha_dash:ascii|max:50',
|
||||
'device' => 'required|alpha_dash:ascii|max:10',
|
||||
],
|
||||
];
|
||||
|
||||
function signIn(): \Illuminate\Http\JsonResponse
|
||||
{
|
||||
$request = request();
|
||||
$username = $request->input('username');
|
||||
$password = $request->input('password');
|
||||
$device = $request->input('device');
|
||||
|
||||
$oCustomerUser = new CustomerUser();
|
||||
$oUser = $oCustomerUser->findItemByUsername($username);
|
||||
|
||||
if (!$oUser) {
|
||||
return $this->error('用户名不存在');
|
||||
}
|
||||
|
||||
if (!$oCustomerUser->checkPasswd($oUser->id,$password)) {
|
||||
return $this->error('密码错误');
|
||||
}
|
||||
|
||||
$oAuthService = new AuthService();
|
||||
$token = $oAuthService->createTokenToUser($oUser->id,$device);
|
||||
|
||||
$data = [
|
||||
'token' => $token,
|
||||
'user' => [
|
||||
'id' => $oUser->id,
|
||||
'username' => $oUser->username,
|
||||
'nickname' => $oUser->nickname,
|
||||
'is_google_auth' => $oUser->is_google_auth,
|
||||
'created_at' => $oUser->created_at,
|
||||
'updated_at' => $oUser->updated_at,
|
||||
],
|
||||
];
|
||||
|
||||
return $this->success($data);
|
||||
|
||||
}
|
||||
|
||||
function signOut(): \Illuminate\Http\JsonResponse
|
||||
{
|
||||
$oAuthService = new AuthService();
|
||||
$token = $oAuthService->getTokenFromReq();
|
||||
$aUser = $oAuthService->getCurrentUser();
|
||||
$oAuthService->delTokenToUser($aUser['uid'],$token);
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
function register()
|
||||
{
|
||||
$request = request();
|
||||
$username = $request->input('username');
|
||||
$password = $request->input('password');
|
||||
$device = $request->input('device');
|
||||
|
||||
$oCustomerUser = new CustomerUser();
|
||||
$oUser = $oCustomerUser->findItemByUsername($username,['id']);
|
||||
|
||||
if ($oUser) {
|
||||
return $this->error('用户名已存在');
|
||||
}
|
||||
|
||||
$oUser = $oCustomerUser->addUser([
|
||||
'username' => $username,
|
||||
'password' => $password,
|
||||
'nickname' => $username,
|
||||
]);
|
||||
|
||||
if (!$oUser) {
|
||||
return $this->error('注册失败');
|
||||
}
|
||||
|
||||
$oAuthService = new AuthService();
|
||||
$token = $oAuthService->createTokenToUser($oUser->id,$device);
|
||||
|
||||
$data = [
|
||||
'token' => $token,
|
||||
'user' => [
|
||||
'id' => $oUser->id,
|
||||
'username' => $oUser->username,
|
||||
'nickname' => $oUser->nickname,
|
||||
'is_google_auth' => $oUser->is_google_auth,
|
||||
'created_at' => $oUser->created_at,
|
||||
'updated_at' => $oUser->updated_at,
|
||||
],
|
||||
];
|
||||
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
}
|
||||
@ -42,6 +42,7 @@ class Kernel extends HttpKernel
|
||||
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
|
||||
\Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
|
||||
\Illuminate\Routing\Middleware\SubstituteBindings::class,
|
||||
\App\Http\Middleware\ReqRecordMiddleware::class,
|
||||
],
|
||||
];
|
||||
|
||||
@ -53,16 +54,18 @@ class Kernel extends HttpKernel
|
||||
* @var array<string, class-string|string>
|
||||
*/
|
||||
protected $middlewareAliases = [
|
||||
'auth' => \App\Http\Middleware\Authenticate::class,
|
||||
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
|
||||
'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
|
||||
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
|
||||
'can' => \Illuminate\Auth\Middleware\Authorize::class,
|
||||
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
|
||||
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
|
||||
'signed' => \App\Http\Middleware\ValidateSignature::class,
|
||||
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
|
||||
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
|
||||
// 'auth' => \App\Http\Middleware\Authenticate::class,
|
||||
// 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
|
||||
// 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
|
||||
// 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
|
||||
// 'can' => \Illuminate\Auth\Middleware\Authorize::class,
|
||||
// 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
|
||||
// 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
||||
// 'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
|
||||
// 'signed' => \App\Http\Middleware\ValidateSignature::class,
|
||||
// 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
|
||||
// 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
|
||||
'auth' => \App\Http\Middleware\AuthMiddleware::class,
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
44
app/Http/Middleware/AuthMiddleware.php
Normal file
44
app/Http/Middleware/AuthMiddleware.php
Normal file
@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use App\Const\Responses;
|
||||
use App\Service\AuthService;
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class AuthMiddleware
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
|
||||
*/
|
||||
public function handle(Request $request, Closure $next): Response
|
||||
{
|
||||
//检查是否登录,并且将登录信息放在di中
|
||||
$oAuthService = new AuthService();
|
||||
$sToken = $oAuthService->getTokenFromReq($request);
|
||||
$aUserInfo = $oAuthService->getUserInfoByToken($sToken);
|
||||
if($aUserInfo == null){
|
||||
return response()->json([
|
||||
'code'=>Responses::CODE_ERROR,
|
||||
'msg'=>'未登录',
|
||||
]);
|
||||
}
|
||||
$oCustomerUser = new \App\Models\Customer\CustomerUser();
|
||||
$oCustomerUser = $oCustomerUser->findUserByUidWithCache($aUserInfo['uid']);
|
||||
if(empty($oCustomerUser)){
|
||||
return response()->json([
|
||||
'code'=>Responses::CODE_ERROR,
|
||||
'msg'=>'用户不存在',
|
||||
]);
|
||||
}
|
||||
$oAuthService->setCurrentUser($oCustomerUser->toArray());
|
||||
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
46
app/Http/Middleware/ReqRecordMiddleware.php
Normal file
46
app/Http/Middleware/ReqRecordMiddleware.php
Normal file
@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use App\Const\Filter;
|
||||
use App\Tools\Tools;
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class ReqRecordMiddleware
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
|
||||
*/
|
||||
public function handle(Request $request, Closure $next): Response
|
||||
{
|
||||
//记录请求
|
||||
$sReqId = \App\Tools\Tools::generateRandStr(16);
|
||||
$sReqIp = $request->getClientIp();
|
||||
$sReqUrl = $request->getUri();
|
||||
$sReqMethod = $request->getMethod();
|
||||
$sReqParams = json_encode($request->all());
|
||||
$sReqTime = date('Y-m-d H:i:s');
|
||||
$sReqUserAgent = $request->userAgent();
|
||||
$sReqReferer = $request->headers->get('referer');
|
||||
$sReqHeader = json_encode($request->headers->all());
|
||||
|
||||
$aData = [
|
||||
'req_id'=>$sReqId,
|
||||
'req_ip'=>$sReqIp,
|
||||
'req_url'=>$sReqUrl,
|
||||
'req_method'=>$sReqMethod,
|
||||
'req_params'=>Tools::filterDataParams($sReqParams,Filter::REQ_LOG_FILTER),
|
||||
'req_time'=>$sReqTime,
|
||||
'req_user_agent'=>$sReqUserAgent,
|
||||
'req_referer'=>$sReqReferer,
|
||||
'req_header'=>$sReqHeader,
|
||||
];
|
||||
Log::info('req_record',$aData);
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
57
app/Models/Base/BaseModel.php
Normal file
57
app/Models/Base/BaseModel.php
Normal file
@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Base;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class BaseModel extends Model
|
||||
{
|
||||
|
||||
function checkColInFill($aItem)
|
||||
{
|
||||
foreach ($aItem as $key => $value) {
|
||||
if (!in_array($key, $this->fillable)) {
|
||||
unset($aItem[$key]);
|
||||
}
|
||||
}
|
||||
return $aItem;
|
||||
}
|
||||
|
||||
function addItem($aItem): Model|\Illuminate\Database\Eloquent\Builder|bool
|
||||
{
|
||||
$aItem = $this->checkColInFill($aItem);
|
||||
if (empty($aItem)) return false;
|
||||
return $this->newQuery()->create($aItem);
|
||||
}
|
||||
|
||||
function delItem($id)
|
||||
{
|
||||
return $this->newQuery()->where($this->primaryKey, $id)->delete();
|
||||
}
|
||||
|
||||
function updateItem($aItem): bool|int
|
||||
{
|
||||
$aItem = $this->checkColInFill($aItem);
|
||||
if (empty($aItem)) return false;
|
||||
if (isset($aItem[$this->primaryKey])) return false;
|
||||
return $this->newQuery()->where($this->primaryKey,$aItem[$this->primaryKey])->update($aItem);
|
||||
}
|
||||
|
||||
function findItem($id,$col=['*']): Model|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Builder|array|null
|
||||
{
|
||||
return $this->newQuery()->find($id,$col);
|
||||
}
|
||||
|
||||
function findItemByWhere($aWhere,$col=['*']): Model|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Builder|array|null
|
||||
{
|
||||
return $this->newQuery()->where($aWhere)->first($col);
|
||||
}
|
||||
|
||||
function getItemsByWhere($aWhere,$col=['*']): \Illuminate\Database\Eloquent\Collection|array
|
||||
{
|
||||
return $this->newQuery()->where($aWhere)->get($col);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
7
app/Models/Base/CustomerBaseModel.php
Normal file
7
app/Models/Base/CustomerBaseModel.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Base;
|
||||
|
||||
class CustomerBaseModel extends BaseModel {
|
||||
|
||||
}
|
||||
68
app/Models/Customer/CustomerUser.php
Normal file
68
app/Models/Customer/CustomerUser.php
Normal file
@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Customer;
|
||||
|
||||
use App\Const\RedisConst;
|
||||
use App\Models\Base\CustomerBaseModel;
|
||||
use App\Service\AuthService;
|
||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Redis;
|
||||
|
||||
class CustomerUser extends CustomerBaseModel
|
||||
{
|
||||
protected $table = 'customer_users';
|
||||
protected $primaryKey = 'id';
|
||||
protected $fillable = [
|
||||
'id',
|
||||
'status',
|
||||
'im_user_id',
|
||||
'country_name',
|
||||
'username',
|
||||
'password',
|
||||
'nickname',
|
||||
'email',
|
||||
'phone_area',
|
||||
'phone',
|
||||
'is_google_auth',
|
||||
'created_at',
|
||||
'updated_at',
|
||||
];
|
||||
|
||||
protected function password(): Attribute
|
||||
{
|
||||
return Attribute::make(
|
||||
set: fn (string $value) => Hash::make($value),
|
||||
);
|
||||
}
|
||||
|
||||
function checkPasswd($iUid,$sPasswd):bool
|
||||
{
|
||||
$oUser = $this->where('id',$iUid)->first();
|
||||
if(empty($oUser)) return false;
|
||||
return Hash::check($sPasswd,$oUser->password);
|
||||
}
|
||||
|
||||
function addUser($aItem): \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Builder|bool
|
||||
{
|
||||
// if(isset($aItem['password']) && !empty($aItem['password'])) $aItem['password'] = Hash::make($aItem['password']);
|
||||
return $this->addItem($aItem);
|
||||
}
|
||||
|
||||
function findItemByUsername($sUsername,$col=['*']): \Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Builder|array|null
|
||||
{
|
||||
return $this->newQuery()->where('username',$sUsername)->first($col);
|
||||
}
|
||||
|
||||
function findUserByUidWithCache($iUid): \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Builder|array|null
|
||||
{
|
||||
return Cache::remember(RedisConst::ORM_CACHE_USER.$iUid,RedisConst::ORM_FIND_CACHE_SECOND,function ()use ($iUid){
|
||||
return $this->findItem($iUid);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
152
app/Service/AuthService.php
Normal file
152
app/Service/AuthService.php
Normal file
@ -0,0 +1,152 @@
|
||||
<?php
|
||||
|
||||
namespace App\Service;
|
||||
|
||||
use App\Const\RedisConst;
|
||||
use App\Tools\Tools;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Facades\Redis;
|
||||
|
||||
class AuthService
|
||||
{
|
||||
|
||||
const tokenUidInfo = [
|
||||
'uid' => '',
|
||||
'device' => '',
|
||||
];
|
||||
const uidTokenList = [
|
||||
'token_1' => [
|
||||
'device' => '',
|
||||
'created_time' => '',
|
||||
'exp_time' => '',
|
||||
],
|
||||
];
|
||||
|
||||
function checkTokenLogin($sToken): bool
|
||||
{
|
||||
return $this->getUserInfoByToken($sToken) != null;
|
||||
}
|
||||
|
||||
function getUserInfoByToken($sToken)
|
||||
{
|
||||
if (empty($sToken)) return null;
|
||||
$sUidInfo = Redis::get(RedisConst::TOKEN_UID . $sToken);
|
||||
if (empty($sUidInfo)) return null;
|
||||
return unserialize($sUidInfo);
|
||||
}
|
||||
|
||||
function setUserInfoToToken($sToken, $iUid, $sDevice)
|
||||
{
|
||||
$sUidInfo = serialize([
|
||||
'uid' => $iUid,
|
||||
'device' => $sDevice,
|
||||
]);
|
||||
return Redis::set(RedisConst::TOKEN_UID . $sToken, $sUidInfo, RedisConst::COMMON_EXP_TIME);
|
||||
}
|
||||
|
||||
function delUserInfoToToken($sToken)
|
||||
{
|
||||
return Redis::del(RedisConst::TOKEN_UID . $sToken);
|
||||
}
|
||||
|
||||
function getAllTokenInfoByUid($iUid)
|
||||
{
|
||||
$sTokenList = Redis::get(RedisConst::UID_TOKENS . $iUid);
|
||||
if (empty($sToken)) return null;
|
||||
return unserialize($sTokenList);
|
||||
}
|
||||
|
||||
function checkTokenInUid($iUid, $sToken): bool
|
||||
{
|
||||
$aTokenInfoList = $this->getAllTokenInfoByUid($iUid);
|
||||
if (empty($aTokenInfoList)) return false;
|
||||
$aTokenList = array_keys($aTokenInfoList);
|
||||
return in_array($sToken, $aTokenList);
|
||||
}
|
||||
|
||||
function addTokenToUidInfo($iUid, $sToken, $sDevice)
|
||||
{
|
||||
$aTokenInfoList = $this->getAllTokenInfoByUid($iUid);
|
||||
if (empty($aTokenInfoList)) {
|
||||
$aTokenInfoList = [];
|
||||
}
|
||||
$aTokenInfoList[$sToken] = [
|
||||
'device' => $sDevice,
|
||||
'created_time' => Carbon::now()->toDateTimeString(),
|
||||
'exp_time' => Carbon::parse(time() + RedisConst::COMMON_EXP_TIME)->toDateTimeString(),
|
||||
];
|
||||
$sTokenList = serialize($aTokenInfoList);
|
||||
return Redis::set(RedisConst::UID_TOKENS . $iUid, $sTokenList);
|
||||
}
|
||||
|
||||
function delTokenByUidInfo($iUid, $sToken)
|
||||
{
|
||||
$aTokenInfoList = $this->getAllTokenInfoByUid($iUid);
|
||||
if (empty($aTokenInfoList)) return false;
|
||||
if (!isset($aTokenInfoList[$sToken])) return false;
|
||||
unset($aTokenInfoList[$sToken]);
|
||||
$sTokenList = serialize($aTokenInfoList);
|
||||
return Redis::set(RedisConst::UID_TOKENS . $iUid, $sTokenList);
|
||||
}
|
||||
|
||||
function getTokenFromReq(\Illuminate\Http\Request $request = null)
|
||||
{
|
||||
if ($request == null) $request = request();
|
||||
$sToken = $request->header('_token');
|
||||
if (!empty($sToken)) return $sToken;
|
||||
$sToken = $request->input('_token');
|
||||
if (!empty($sToken)) return $sToken;
|
||||
return null;
|
||||
}
|
||||
|
||||
function generateTokenStr(): string
|
||||
{
|
||||
return time() . Tools::generateRandStr(24);
|
||||
}
|
||||
|
||||
//登入使用
|
||||
function createTokenToUser($iUid, $sDevice): string
|
||||
{
|
||||
do {
|
||||
$sToken = $this->generateTokenStr();
|
||||
if (!$this->checkTokenLogin($sToken)) break;
|
||||
} while (1);
|
||||
|
||||
$this->setUserInfoToToken($sToken, $iUid, $sDevice);
|
||||
$this->addTokenToUidInfo($iUid, $sToken, $sDevice);
|
||||
return $sToken;
|
||||
}
|
||||
|
||||
//登出使用
|
||||
function delTokenToUser($iUid, $sToken): void
|
||||
{
|
||||
$this->delUserInfoToToken($sToken);
|
||||
$this->delTokenByUidInfo($iUid, $sToken);
|
||||
}
|
||||
|
||||
function getTokenInfo()
|
||||
{
|
||||
$sToken = $this->getTokenFromReq();
|
||||
if (empty($sToken)) return null;
|
||||
$aUserInfo = $this->getUserInfoByToken($sToken);
|
||||
if (empty($aUserInfo)) return null;
|
||||
return $aUserInfo;
|
||||
}
|
||||
|
||||
function setCurrentUser(array $aUser): void
|
||||
{
|
||||
app()->singleton('customerUser',function () use ($aUser){
|
||||
return $aUser;
|
||||
});
|
||||
}
|
||||
|
||||
function getCurrentUser()
|
||||
{
|
||||
if(app()->has('customerUser')){
|
||||
return app()->get('customerUser');
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
43
app/Tools/Tools.php
Normal file
43
app/Tools/Tools.php
Normal file
@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace App\Tools;
|
||||
class Tools
|
||||
{
|
||||
|
||||
//生成随机数
|
||||
public static function generateRandStr($length = 8)
|
||||
{
|
||||
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789=-+';
|
||||
$str = '';
|
||||
for ($i = 0; $i < $length; $i++) {
|
||||
$str .= $chars[mt_rand(0, strlen($chars) - 1)];
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
|
||||
static function filterDataParams($aData, $aParams)
|
||||
{
|
||||
foreach ($aParams as $sParam) {
|
||||
if (isset($aData[$sParam])) {
|
||||
$aData[$sParam] = self::hideStr($aData[$sParam]);
|
||||
}
|
||||
}
|
||||
return $aData;
|
||||
}
|
||||
|
||||
//字符串敏感部分中间隐藏
|
||||
static function hideStr($sStr, $iStart = 5, $iEnd = 3, $sReplace = '*')
|
||||
{
|
||||
if (empty($sStr)) return $sStr;
|
||||
$iStrLen = mb_strlen($sStr);
|
||||
if ($iStrLen <= $iStart) return $sStr;
|
||||
$iEnd = $iEnd > 0 ? $iEnd : $iStrLen - $iStart;
|
||||
$sHideStr = '';
|
||||
for ($i = 0; $i < $iEnd; $i++) {
|
||||
$sHideStr .= $sReplace;
|
||||
}
|
||||
return mb_substr($sStr, 0, $iStart) . $sHideStr . mb_substr($sStr, $iStart + $iEnd);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
11
public/index.html
Normal file
11
public/index.html
Normal file
@ -0,0 +1,11 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
asd
|
||||
</body>
|
||||
</html>
|
||||
1
public/nginx.htaccess
Normal file
1
public/nginx.htaccess
Normal file
@ -0,0 +1 @@
|
||||
|
||||
@ -14,6 +14,13 @@ use Illuminate\Support\Facades\Route;
|
||||
|
|
||||
*/
|
||||
|
||||
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
|
||||
return $request->user();
|
||||
//Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
|
||||
// return $request->user();
|
||||
//});
|
||||
|
||||
//需要登录的路由
|
||||
Route::middleware('auth')->group(function () {
|
||||
Route::post('/test', function () {
|
||||
return 'test';
|
||||
});
|
||||
});
|
||||
|
||||
@ -13,6 +13,6 @@ use Illuminate\Support\Facades\Broadcast;
|
||||
|
|
||||
*/
|
||||
|
||||
Broadcast::channel('App.Models.User.{id}', function ($user, $id) {
|
||||
return (int) $user->id === (int) $id;
|
||||
});
|
||||
//Broadcast::channel('App.Models.User.{id}', function ($user, $id) {
|
||||
// return (int) $user->id === (int) $id;
|
||||
//});
|
||||
|
||||
@ -13,6 +13,6 @@ use Illuminate\Support\Facades\Route;
|
||||
|
|
||||
*/
|
||||
|
||||
Route::get('/', function () {
|
||||
return view('welcome');
|
||||
});
|
||||
//Route::get('/', function () {
|
||||
// return view('welcome');
|
||||
//});
|
||||
|
||||
Reference in New Issue
Block a user