【问题标题】:Laravel - How to exclude a particular endpoint from from role permissionLaravel - 如何从角色权限中排除特定端点
【发布时间】:2019-09-12 05:13:47
【问题描述】:

我正在使用 Laravel Spatie 为我的 api 提供用户权限。版本是 Laravel-5.8。

订单控制器

<?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 以实现创建和存储订单的预期结果?

【问题讨论】:

    标签: laravel api


    【解决方案1】:

    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')){};
    

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

    【讨论】:

      猜你喜欢
      • 2020-05-22
      • 2020-12-17
      • 2016-09-13
      • 2014-09-15
      • 2017-09-13
      • 2020-05-05
      • 2019-04-27
      • 2019-07-31
      • 1970-01-01
      相关资源
      最近更新 更多