Featured image of post 路由权限控制中,一个分页列表权限能同时控制所有列表权限

路由权限控制中,一个分页列表权限能同时控制所有列表权限

一种简单有效的进行权限控制方法

最近在写api在写权限控制时候遇到了一个问题。
还是原来的控制权限的方法Laravel中使用路由控制权限(不限于Laravel,只是一种思想)


有这么两个路由别名:
城市列表带分页:cities.index,所有城市:cities.index.all
这是两个权限,但是为了用户只分配了cities.index的权限,也能同时拥有cities.index.all的权限,
因为这两个都属于列表,这是正常的逻辑,所以需要我们在验证这一点点小修改。

<?php

namespace App\Http\Middleware;

use App\Models\Permission;
use App\Models\User;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;

class AdminPermission
{
    /**
     * 先获取当前路由的名字
     * 查询当前路由是否需要权限访问
     * 通过 or 权限不足
     *
     * @param Request $request
     * @param Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $route = Route::currentRouteName();

        // 这条路由没有名字
        if (is_null($route)) {
            return $next($request);
        }


        // 这个路由是否是以 all 结尾的
        if (ends_with($route, '.all')) {
            $route = substr($route, 0, -4);
        }

        // 这条路由是否需要权限
        // 后期提升性能考虑使用 cache 缓存
        if ($permission = Permission::query()->where('route', $route)->first()) {

            /**
             * @var $user User
             */
            $user = $request->user();

            // 当前登录的用户是否有这个操作权限
            if (! $user->hasPermissionTo($permission)) {
                throw new UnauthorizedHttpException('permission', trans('error_permission.denied'), null, Response::HTTP_FORBIDDEN);
            }
        }


        return $next($request);
    }
}