前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >路由权限控制中,一个分页列表权限能同时控制所有列表权限

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

作者头像
seth-shi
发布2023-12-18 14:36:10
1210
发布2023-12-18 14:36:10
举报
文章被收录于专栏:seth-shi的专栏seth-shi的专栏

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

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

代码语言:javascript
复制
<?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);
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档