最近在写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);
}
}