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

2023-12-18 14:36:10 浏览数 (3)

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

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

代码语言:javascript复制
<?php

namespace AppHttpMiddleware;

use AppModelsPermission;
use AppModelsUser;
use Closure;
use IlluminateHttpRequest;
use IlluminateSupportFacadesRoute;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpKernelExceptionUnauthorizedHttpException;

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

0 人点赞