Laravel-如何从角色权限中排除特定端点

时间:2019-09-11 17:09:01

标签: laravel api

我正在使用Laravel Spatie的api获得用户权限。版本是Laravel-5.8。

OrderController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Order;
use App\User;
use App\Student;
use App\Guardian;

class OrderController extends Controller
{
    public function index(Request $request)
    {
        if(!Auth::user()->hasPermissionTo('View Order'))
            return response()->json([ "message" => 'User do not have permission'], 401);

        return response()->json(::with('order_detail')->get(), 200);
    }

    public function store(Request $request)
    {
        if(!Auth::user()->hasPermissionTo('Add Order'))
            return response()->json([ "message" => 'User do not have permission'], 401);
        $request->validate([
            'week_day' => 'required|integer',
            'start' => 'required',
            'end' => 'required',
            'amount' => 'required',
            'full_name' => 'required'
        ]);

        $orders = Order::create($request->all());
        return json_encode($orders);
    }

    public function show($id)
    {
        if(!Auth::user()->hasPermissionTo('View Order'))
            return response()->json([ "message" => 'User do not have permission'], 401);
        return json_encode(Order::findOrFail($id));
    }


}

api.php

Route::group([
    'middleware' => 'auth:api'
], function () {
    Route::get('order/mobile', 'OrderController@mobile');
    Route::resource('order', 'OrderController', ['only' => ['index', 'show', 'store', 'update', 'destroy']]);
});

我希望所有访问该网站的人都可以创建,存储和发送订单,而无需登录。但是,索引,更新和删除需要权限。对此不应该被允许。如何调整我的控制器和api.php以实现创建和存储订单的预期结果?

1 个答案:

答案 0 :(得分:0)

路由组上的

auth中间件阻止了所有未经身份验证的用户访问它们。您可以删除中间件,也可以创建两个组,其中索引,更新和删除在auth中间件下,而第二个组在其他路由中没有auth

如果从路由组中删除中间件,则可以将其添加到控制器中的特定方法中,

 public function __construct()
    {
        $this->middleware('auth')->only(['index', 'update', 'destroy']);
    }

当然,您还可以指定Spatie中间件

public function __construct()
    {        
       $this->middleware('role:Contributor')->only(['index', 'update', 'destroy']);       
    }

但是,您还可以在控制器方法中手动测试各种用户权限

if ($user->hasRole('Contributor')){};

这样,您可以允许未经身份验证的用户执行某些操作,但将某些操作限制为对用户进行身份验证。