我是Laravel和Stackoverflow的新手,所以如果我的问题格式不正确,我会道歉。关于此的任何提示将不胜感激。
我最近设法使用jwt-auth。
在我的Laravel API上实现了令牌认证我可以使用jwt-auth中间件保护我的api路由,以确保特定用户已收到令牌(已登录)。
Route::group(['middleware' => ['jwt.auth']], function() {
// List Books
Route::get('books', 'BookController@index');
)};
JWT是在我创建的名为APILoginController的控制器中创建的,其中包含:
public function login(Request $request)
{
// check the users credentials
$credentials = $request->only('email', 'password');
try {
if (! $token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'Invalid Credentials'], 401);
}
} catch (JWTException $e) {
return response()->json(['error' => 'could_not_create_token'], 500);
}
// the users credentials are correct - return web token
$user = Auth::user();
return response()->json(compact('token', 'user')) ;
}
我已将is_admin字段添加到我的用户表
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->integer('is_admin');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
我希望我能够使用此字段来保护某些路由不受常规用户的影响,其中is_admin = 0并且只允许管理员(is_admin = 1)访问它们。我不知道这是否是正确的方法,但它似乎是最简单的。
任何帮助或指导都会非常感激,因为我一直在努力解决这个问题。我遇到的大多数教程似乎都创建了另一个带有角色的表格,但这似乎有点过分和复杂,因为我的技能水平和我想要创建的应用程序。
亲切的问候, 马修
答案 0 :(得分:1)
我通常使用Laravel附带的Passport,但我认为它非常相似。
您可以创建自定义中间件,以验证尝试访问端点的用户类型。在您的情况下,它将验证用户是否是is_admin =>你会有这样的事情:
Route::group(['middleware' => ['jwt.auth', 'is_admin']], function() {
您的另一个选择是在用户首次请求时为您的令牌定义范围。我不知道jwt-auth是否可行,但你会有这样的事情:
->middleware('scopes:admin');
希望有所帮助!
答案 1 :(得分:0)
您需要做的是编写自己的中间件来检查用户是否是管理员
php artisan make:middleware checkAdmin
此命令将在您的app / Http / Middleware目录中放置一个新的CheckAdmin类
<?php
namespace App\Http\Middleware;
use Closure;
class checkAdmin
{
public function handle($request, Closure $next)
{
//get admin value of user from database
if ($adminValue != 1) {
return redirect('home');
}
return $next($request);
}
}
现在将中间件添加到所有仅限管理员的路由
Route::get('admin/profile', function () {
//
})->middleware(CheckAdmin::class);
有关Laravel中间件的更多信息,请参阅文档 https://laravel.com/docs/5.6/middleware