??Auth多用戶認(rèn)證/單點(diǎn)/多點(diǎn)登入(JWT,SESSION)

v2.0.0
版本
2025-03-17
版本更新時(shí)間
2374
安裝
18
star
安裝
composer require shopwwi/webman-auth
配置文件
//路徑 config/plugin/shopwwi/auth/app.php
// app_key 如果是laravel遷移過來的用戶需與之前l(fā)aravel的保持一致 如果是全新的 隨意寫個key即可
// jwt 配置項(xiàng)按自己需求配置即可 redis默認(rèn)為false 如果要限制終端 則改為true
配置多用戶
//初始化的示例 一定要改成自己實(shí)際的
'guard' => [
'user' => [
'key' => 'id', //主鍵
'field' => ['id','name','email','mobile'], //設(shè)置允許寫入擴(kuò)展中的字段 一般為數(shù)據(jù)表存在的字段
'num' => 0, //-1為不限制終端數(shù)量 0為只支持一個終端在線 大于0為同一賬號同終端支持?jǐn)?shù)量 建議設(shè)置為1 則同一賬號同終端在線1個
'model'=> app\model\Test::class // 默認(rèn)laravel
// 'model'=> [app\model\Test::class,'thinkphp'] // 指定ORM類型
]
];
// 配置示例(根據(jù)自己真實(shí)情況 user一定要存在 因?yàn)槟J(rèn)就是user)
// field 是可以通過jwtKey解析出來的 請勿用敏感字段 以免信息泄露
'guard' => [
'user' => [ // 普通用戶
'key' => 'id', //主鍵
'field' => ['id','username','email','mobile','avatar'], //設(shè)置允許寫入擴(kuò)展中的字段 一般為數(shù)據(jù)表存在的字段
'num' => 0, //-1為不限制終端數(shù)量 0為只支持一個終端在線 大于0為同一賬號同終端支持?jǐn)?shù)量 建議設(shè)置為1 則同一賬號同終端在線1個
'model'=> app\model\User::class //用戶表模型
],
'admin' => [ // 平臺用戶
'key' => 'id', //主鍵
'field' => ['id','name','avatar'], //設(shè)置允許寫入擴(kuò)展中的字段 一般為數(shù)據(jù)表存在的字段
'num' => 0, //-1為不限制終端數(shù)量 0為只支持一個終端在線 大于0為同一賬號同終端支持?jǐn)?shù)量 建議設(shè)置為1 則同一賬號同終端在線1個
'model'=> app\model\Admin::class //管理員表模型
]
];
使用方法
- 生成JWT密鑰(命令行)
php webman shopwwi:auth
- 加密密碼
use Shopwwi\WebmanAuth\Facade\Auth;
//不可逆轉(zhuǎn) 只能用password_verify來判斷正確與否
$password = '123456';
Auth::bcrypt($password);
3.自動對字段進(jìn)行驗(yàn)證且登入
use Shopwwi\WebmanAuth\Facade\Auth;
//驗(yàn)證字段一定得和設(shè)定得角色模型相匹配可以是任何字段組
// 這里自動進(jìn)行了model查庫操作 如果你的不支持 請用自定義登入
$tokenObject = Auth::attempt(['name'=> 'tycoonSong','password' => '123456']);
//返回對象$tokenObject 包含token_type,expires_in,refresh_expires_in,access_token,refresh_token
// 默認(rèn)為user角色 當(dāng)你是admin登入時(shí)
$tokenObject = Auth::guard('admin')->attempt(['name'=> 'tycoonSong','password' => '123456']);
4.自定義登入
use Shopwwi\WebmanAuth\Facade\Auth;
use app\model\User;
use app\model\Admin;
//返回對象$tokenObject 包含token_type,expires_in,refresh_expires_in,access_token,refresh_token
$user = User::first();
$tokenObject = Auth::login($user);//$user可以是對象 同樣可以是數(shù)組
// 默認(rèn)為user角色 當(dāng)你是admin登入時(shí)
$admin = Admin::first();
$tokenObject = Auth::guard('admin')->login($admin);
5.獲取當(dāng)前登入用戶信息
use Shopwwi\WebmanAuth\Facade\Auth;
$user = Auth::user(); //得到用戶模型對象,查庫數(shù)據(jù),需查詢動態(tài)數(shù)據(jù)時(shí)使用
$user = Auth::user(true); // 得到擴(kuò)展數(shù)據(jù)對象,非查庫數(shù)據(jù),比如只需得到用戶ID或不常更新字段使用
$admin = Auth::guard('admin')->user(); //當(dāng)前登入管理員
6.退出登入
use Shopwwi\WebmanAuth\Facade\Auth;
$logout = Auth::logout(); //退出當(dāng)前用戶
$logout = Auth::logout(true); // 退出所有當(dāng)前用戶終端
$logout = Auth::guard('admin')->logout(); //管理員退出
7.刷新當(dāng)前登入用戶token
use Shopwwi\WebmanAuth\Facade\Auth;
$refresh = Auth::refresh();
$refresh = Auth::guard('admin')->refresh(); //管理員刷新
8.單獨(dú)設(shè)置過期時(shí)間
use Shopwwi\WebmanAuth\Facade\Auth;
use app\model\User;
$user = User::first();
Auth::accessTime(3600)->refreshTime(360000)->login($user);
Auth::accessTime(3600)->refreshTime(360000)->attempt(['name'=> 'tycoonSong','password' => '123456']);
Auth::accessTime(3600)->refresh();
9.獲取報(bào)錯信息 Auth::fail();
//默認(rèn)設(shè)定是不會報(bào)錯的
$user = Auth::user(); //當(dāng)沒有登入或異常時(shí)返回的null 用于用戶可登入或可不登入場景里 只需要判斷 $user == null 即可
//而比如在會員中心調(diào)用時(shí)
$user = Auth::fail()->user(); //走的是異常處理類http://www.wtbis.cn/doc/webman/exception.html
- 開啟redis后,建議開啟
// 在使用過程中我們通常一個接口允許多端使用的情況 那么默認(rèn)設(shè)置是不限制使用端口的
// 可當(dāng)你想允許比如web端同一賬號只允許存在三個終端在線或同一賬號APP只允許一個終端使用
// 默認(rèn)為web終端 傳參client_type=web或你其它的終端client_type=ios
//config/plugin/shopwwi/auth/app.php設(shè)置
'guard' => [
'user' => [ // 普通用戶
'key' => 'id', //主鍵
'field' => ['id','username','email','mobile','avatar'], //設(shè)置允許寫入擴(kuò)展中的字段 一般為數(shù)據(jù)表存在的字段
'num' => 0, //-1為不限制終端數(shù)量 0為只支持一個終端在線 大于0為同一賬號同終端支持?jǐn)?shù)量 建議設(shè)置為1 則同一賬號同終端在線1個
'model'=> app\model\User::class //用戶表模型
]
]
'jwt' => [
'redis' => false,
....
]
Auth::logout(true); // 退出所有當(dāng)前用戶終端
-
獲取所有redis用戶及終端狀態(tài)
// 你可以使用redis hash對終端在線更好的管理 比如對某個用戶進(jìn)行下線處理,或查詢用戶的token有效期 // 具體業(yè)務(wù)自行根據(jù)需求去實(shí)現(xiàn) 本系統(tǒng)未對這方面業(yè)務(wù)進(jìn)行封裝 $guard = 'user'; Redis::hGetAll('token_'.$guard); // 用戶編號為1 的 token下線清除 ,可以批量 Redis::hDel('token_'.$guard,[1]);
-
直接調(diào)用jwt
use Shopwwi\WebmanAuth\Facade\JWT as JwtFace;
JwtFace::guard('user')->make($extend,$access_exp,$refresh_exp); //生成token 可為make($extend)
JwtFace::guard('user')->refresh($accessTime = 0); //刷新令牌 可為refresh()
JwtFace::guard('user')->verify($token); //$token可以不填則自動驗(yàn)證令牌 verify()
JwtFace::guard('user')->getTokenExtend($token)//$token可以不填則自動驗(yàn)證令牌getTokenExtend()