此文章为 jwt的安装与使用 https://blog.csdn.net/yt_php/article/details/86354133 的续篇
说明:仍是按照文档
auth的认证,
一是判断登陆状态(auth),如未登陆则被拦截,然后转交给登陆模块,这需要一个中间件来完成。
二是管理登陆,即登陆逻辑login,登陆成功则发送给用户一个授权token;及logout退出登陆,销毁token;忘记密码forgetPassword;注册signUp等。这需要一个专门的控制器来完成,在这里编写自定义逻辑。
在这之前,请阅读文档,一些配置略过。
1,创建Auth控制器
php artisan make:controller Api\V1\AuthController
然后只需从文档的example复制粘贴
namespace App\Http\Controllers\Api\V1;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class AuthController extends Controller
{
//登陆
public function login()
{
$credentials = request(['email', 'password']);
//$credentials = request(['mobile', 'password']);
if (! $token = auth()->attempt($credentials)) {
return response()->json(['error' => '用户名密码错误'], 401);
}
return $this->respondWithToken($token);
}
//注册
public function signUp( Request $request ) {
$post = $request->all();
//...验证
$user = User::create($post); //创建用户
$token = auth()->login($user); //登陆
return $this->respondWithToken($token);
}
//忘记密码
public function forgetPassword( Request $request ) {
//$user = .. 更改密码逻辑
//$user->save()
//$token = auth()->login($user);
//return Y::json($this->respondWithToken($token));
}
//me
public function me( ) {
$user = auth()->user()->toArray();
//$user['']=... 自定义逻辑
return response()->json($user);
}
//退出登陆
public function logout()
{
auth()->logout();
//User::clearCache(auth()->id(), false); //如果对用户信息做了缓存,这里清除
return response()->json(['message' => 'Successfully logged out']);
}
//刷新token
public function refresh()
{
return $this->respondWithToken(auth()->refresh());
}
//生成token
protected function respondWithToken($token)
{
return response()->json([
//'username' =>auth()->user()->username,
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => auth()->factory()->getTTL() * 60
]);
}
}
当然不要忘了添加对应的路由
Route::group(
['prefix'=>'v1','namespace'=>'V1'],
function(){
Route::prefix('auth')->group(function () {
Route::post('login', '[email protected]');
Route::post('signUp', '[email protected]');
Route::post('forgetPassword', '[email protected]');
Route::get('logout', '[email protected]');
Route::get('refresh', '[email protected]');
});
}
);
2,测试
使用postman工具
因为我们的注册逻辑并没有写,所以手动在users表中,添加[email protected],password= Hash::make(123456);
这里jwt组件的使用就算完成了。之后的每次请求,携带上access_token。
复制刚刚的access_token
3,第二部分,回到文章开头的中间件部分。
文档中是这么写的
public function __construct()
{
$this->middleware('auth:api', ['except' => ['login']]);
}
但也可以用专门的中间件来完成,易管理和扩展。
php artisan make:middleware ApiAuth
编写中间件
public function handle($request, Closure $next)
{
$auth = auth();
$auth->shouldUse('api');
if ($request->is(...$this->except) || ($auth->check() && $auth->user()->status == 1)) {
return $next($request);
}
return response()->json(['code'=>401,'message' => '用户验证失败,请重新登录']);
}
protected $except = [
'v1/auth/login', //登陆
'v1/auth/signUp', //注册
'v1/sendSms', //发送邮件
'v1/test/*', //测试
];
这里除了判断登陆,还对当用户是否被禁用状态的判断。并且添加了不需要验证的路由。
注册中间件
使用中间件
测试:
刚刚我退出了登陆,下面请求forgetPassword方法。
end
目标:导入乌干达一年的地表温度 (LST) 数据。 使用时间序列图表观察温度的时间模式。 计算用于展示和出口的年平均温度。遥感(卫星衍生)数据是有关土地覆盖、植被、降雨量、温度和其他气候变量的丰富信息来源。在许多情况下,卫星数据可以追溯到 1980 年代,因此提供了一种对不断变化的地理进行历史分析的方法。在本练习中,您将学习如何从 Google Earth Engine 获取遥感数据。您将学习如何执行时间序列分析来研究选定地理和时间段内气候变量的变化。您还将应用一些常见的地理空间程序(分区、焦
1、全局安装vue-cli$ npm install -global vue-cli2、创建一个基于 webpack 模板的新项目$ vue init webpack 项目名3、按照提示一步步操作,如下图:4、手动安装ajv$ npm install [email protected]^6.0.0 ...
EasyRules动态规则实现
From: http://www.centoscn.com/CentOS/help/2014/1030/4025.html前言crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比较高,一个要求你的程序是24X7小时不宕机,一个是 要求你的调度程序比较可靠,实际
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma...
尝试用案例来学习。分治1、归并排序 - 净的博客 - 程序员秘密https://blog.csdn.net/yangsong95/article/details/82850761动态规划最优决策表(二维表):行:问题的不同阶段列:问题的状态f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}贪心做出在当前看来最好的选择,不会影响之前的决策。局...
在逛 Stack Overflow 的时候,发现了一些访问量像熊耳山一样高的问题,比如说这个:为什么不应该使用Java的原始类型?访问量足足有 205K+,这不得了啊!说明有很多很多的程序员被这个问题困扰过。实话实说吧,本文之前的我就是其中之一。来回顾一下提问者的问题吧:Java 的原始类型是什么?为什么不要使用原始类型?如果不能使用原始类型,有什么更好的选择呢?如果大家也被这个问题困...
今天学习三层架构的时候,在访问jsp文件的时候遇到这么一个报错:Could not initialize class com.web08.dao.impl.StudentDAOlmpl。翻译出来的错误原因,看起来说的是,class definition没找到:不能初始化这个类。当我再回过头发现自己在调用StudentDAOlmpl实现类的时候将它部署在全局属性,并设置private,私有的。其他类就不能找到并调用它了。去掉private后程序成功运行。...
---------------------Tomcat多实例部署---------------------1.安装好 jdk2.安装 tomcatcd /opttar zxvf apache-tomcat-9.0.16.tar.gzmkdir /usr/local/tomcatmv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat23.配
1、firewalld的基本使用启动: systemctl start firewalld关闭: systemctl stop firewalld查看状态: systemctl status firewalld 开机禁用 : systemctl disable firewalld开机启用 : systemctl enable firewalld2、systemctl是CentOS...
1、npm查看镜像配置地址npm get registry2、还原npm镜像配置npm config set registry https://registry.npmjs.org/3、查看npm镜像配置,我们会发现已经变了npm get registry
分组函数最多嵌套两层,当三层或者三层以上时,就会出现分组函数的嵌套太深的提示。我通过下面一条查询一句进行分析。select count(avg(sum(sal)))from emp group by deptno; 这条查询语句,是根据部门号进行分组,第一层分组函数是求每个部门的工资支出和,当第一层分组函数再嵌套一层分组函数求所有部门工资支出的平均值时,结果就只剩一行了