最近在写api
在写权限控制时候遇到了一个问题。
还是原来的控制权限的方法Laravel中使用路由控制权限(不限于Laravel,只是一种思想)
有这么两个路由别名:
城市列表带分页:cities.index
,所有城市:cities.index.all
这是两个权限,但是为了用户只分配了cities.index
的权限,也能同时拥有cities.index.all
的权限,
因为这两个都属于列表,这是正常的逻辑,所以需要我们在验证这一点点小修改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?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); } } |