权限绑定到路由上,如何匹配Restful风格路由

1. 问题描述?

现将权限绑定到Restful风格路由上:如,甲拥有查看某个用户的权限:他获取到的权限路由是(GET) /users/:id 。当他实际查看某个用户,比如请求1号用户时(GET) /users/1,后端该如何校验他是否拥有权限?

再复杂点的路由(GET) /users/:id/articles/:id 。面对请求 (GET) /users/2/articles/3 又该如何校验?

谢谢!

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

我目前是这样做的(仅供参考):

1、为每个需要判定权限的路由都定义好name

file

2、管理角色或者指定用户权限的时候取出所有设定过name的路由

file

3、保存设定的角色或用户权限数据

file

file

4、设定中间件判断权限

file

3年前 评论
yadan (楼主) 3年前
讨论数量: 19
chowjiawei

你的路由设计的太复杂了吧 直接 articles/3 弄个articles的路由权限就行了 你的代码内部去判断这个文章是谁的

3年前 评论
yadan (楼主) 3年前
chowjiawei (作者) 3年前
chowjiawei (作者) 3年前
yadan (楼主) 3年前
chowjiawei (作者) 3年前

我目前是这样做的(仅供参考):

1、为每个需要判定权限的路由都定义好name

file

2、管理角色或者指定用户权限的时候取出所有设定过name的路由

file

3、保存设定的角色或用户权限数据

file

file

4、设定中间件判断权限

file

3年前 评论
yadan (楼主) 3年前
/**
     * 匹配 laravel 参数路由
     *
     * "/parent/123/child/123" matches "/parent/{id}/child/{id}"
     * "/parent/123/child/456" does not match "/parent/{id}/child/{id}"
     * But KeyMatch3 will match both.
     *
     * @param string $key1
     * @param string $key2
     *
     * @return bool
     */
    public static function matchRequestPathWithParams(string $key1, string $key2): bool
    {
        $key2 = str_replace(['/*'], ['/.*'], $key2);

        $tokens = [];
        $pattern = '/\{([^\/]+)\}/';
        $key2 = preg_replace_callback(
            $pattern,
            function ($m) use (&$tokens) {
                $tokens[] = $m[1];

                return '([^\/]+)';
            },
            $key2
        );

        $matched = preg_match_all('~^' . $key2 . '$~', $key1, $matches);
        if (!$matched) {
            return false;
        }

        $values = [];
        foreach ($tokens as $key => $token) {
            if (!isset($values[$token])) {
                $values[$token] = $matches[$key + 1];
            }
            if ($values[$token] != $matches[$key + 1]) {
                return false;
            }
        }

        return true;
    }
3年前 评论
yadan (楼主) 3年前

用casbin的话,就是对用户单独设置一条url的请求类型权限,通用的权限不授权,判断根据请求类型加url判断

3年前 评论
zhuzixian520

在 laravel 中,rbac 主要是 中间件实现的,在 YII2 中,是通过 行为 方式来处理的,本质都是在处理控制器之前,校验用户的权限是否满足系统的 rbac 表里的规则

3年前 评论
yadan (楼主) 3年前

@ 我用的正是 casbin。但我好像没有用到他的精髓,我设计的表数据如下,请指点,万分感谢! file

file

3年前 评论
deatil 3年前
yadan (作者) (楼主) 3年前
chowjiawei

file

file

我的那个方式也是可以的呢 我的做法是在用户表加2个字段 代表上级 和下级 也可以另建关系表

第一张图的用户只是举例哈,需要举一反三

条条大路通罗马 我这个也是一种方法呢

@yadan

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!