laravel + jwt 权限
2020-01-15 11:07
1836 查看
1.安装JWT包
composer require tymon/jwt-auth 1.*@rc
2.配置文件
# 这条命令会在 config 下增加一个 jwt.php 的配置文件 php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
3.生成加密密钥
# 这条命令会在 .env 文件下生成一个加密密钥,如:JWT_SECRET=foobar php artisan jwt:secret
4.将以下代码加入到 User.php 模型中
<?php namespace App; use Tymon\JWTAuth\Contracts\JWTSubject; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable implements JWTSubject # 这里别忘了加 { use Notifiable; // Rest omitted for brevity /** * Get the identifier that will be stored in the subject claim of the JWT. * * @return mixed */ public function getJWTIdentifier() { return $this->getKey(); } /** * Return a key value array, containing any custom claims to be added to the JWT. * * @return array */ public function getJWTCustomClaims() { return []; } }
5.注册两个 Facade
这两个 Facade 并不是必须的,但是使用它们会给你的代码编写带来一点便利。
config/app.php
'aliases' => [ ... // 添加以下两行 'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth', 'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory', ],
6.如果你不使用这两个 Facade,你可以使用辅助函数 auth ()
auth () 是一个辅助函数,返回一个 guard,暂时可以看成 Auth Facade。
// 如果你不用 Facade,你可以这么写 auth('api')->refresh(); // 用 JWTAuth Facade JWTAuth::parseToken()->refresh();
7.修改配置文件
config/auth.php
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'jwt', // 原来是 token 改成jwt 'provider' => 'users', ], ],
8.注册一些路由 route/api.php
jwt 默认是 api
Route::group(['prefix' => 'auth'], function () { Route::group(["middleware" => ["jwt.auth"]], function () { Route::post('logout', 'AuthController@logout')->name('logout'); Route::post('refresh', 'AuthController@refresh')->name('refresh'); Route::get('me', 'AuthController@me')->name('me'); Route::get('home', 'HomeController@index')->name('home.index'); }); Route::post('login','AuthController@login')->name('login'); });
9.创建 token 控制器
php artisan make:controller AuthController
10.将 AuthController 更新内容 为:
<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Auth; use App\Http\Controllers\Controller; class AuthController extends Controller { /** * Create a new AuthController instance. * 要求附带email和password(数据来源users表) * * @return void */ public function __construct() { // 这里额外注意了:官方文档样例中只除外了『login』 // 这样的结果是,token 只能在有效期以内进行刷新,过期无法刷新 // 如果把 refresh 也放进去,token 即使过期但仍在刷新期以内也可刷新 // 不过刷新一次作废 $this->middleware('jwt.auth', ['except' => ['login']]); // 另外关于上面的中间件,官方文档写的是『auth:api』 // 但是我推荐用 『jwt.auth』,效果是一样的,但是有更加丰富的报错信息返回 } /** * Get a JWT via given credentials. * * @return \Illuminate\Http\JsonResponse */ public function login() { $credentials = request(['email', 'password']); if (! $token = auth('api')->attempt($credentials)) { return response()->json(['error' => 'Unauthorized'], 401); } return $this->respondWithToken($token); } /** * Get the authenticated User. * * @return \Illuminate\Http\JsonResponse */ public function me() { return response()->json(auth('api')->user()); } /** * Log the user out (Invalidate the token). * * @return \Illuminate\Http\JsonResponse */ public function logout() { auth('api')->logout(); return response()->json(['message' => 'Successfully logged out']); } /** * Refresh a token. * 刷新token,如果开启黑名单,以前的token便会失效。 * 值得注意的是用上面的getToken再获取一次Token并不算做刷新,两次获得的Token是并行的,即两个都可用。 * @return \Illuminate\Http\JsonResponse */ public function refresh() { return $this->respondWithToken(auth('api')->refresh()); } /** * Get the token array structure. * * @param string $token * * @return \Illuminate\Http\JsonResponse */ protected function respondWithToken($token) { return response()->json([ 'access_token' => $token, 'token_type' => 'bearer', 'expires_in' => auth('api')->factory()->getTTL() * 60 ]); } }
11.将中间件注释掉
'auth' => \App\Http\Middleware\Authenticate::class,//默认auth
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- VUE+JWT实现权限管理
- laravel权限控制(登录,增删改查权限)
- laravel5.1框架下的用户权限管理
- SpringSecurity 实战项目(三)——动态管理Restful风格权限+JWT
- laravel中根据 用户权限 所显示用户对每条数据 相对应的操作按钮
- laravel5.1框架下的权限控制
- Spring Security和 JWT两大利器来打造一个简易的权限系统。
- laravel一步步实现权限控制(2) 登录重写
- Akka-CQRS(16)- gRPC用JWT进行权限管理
- gin-jwt对API进行权限控制
- laravel利用中间件做防非法登录和权限控制示例
- 权限与安全框架:Spring Security+JWT 整合(二)
- laravel5.1的用户权限管理的实现
- Laravel 5.1 中的ACL用户授权及权限检查功能实现教程
- vagrant php-fpm nginx laravel 目录权限问题
- laravel 权限管理
- Laravel5权限管理方法详解
- Laravel 5.2 使用 JWT 完成多用户认证
- Laravel中使用路由控制权限(不限于Laravel,只是一种思想)
- Laravel实现dingo+JWT api接口之配置篇