如何使用Casbin作为ThinkPHP的权限控制中间件

概述

PHP-Casbin是一个强大的、高效的开源访问控制框架,它支持基于各种访问控制模型的权限管理。

Think-Casbin是一个专为 ThinkPHP5.1 定制的 Casbin 的扩展包,使开发者更便捷的在 thinkphp 项目中使用 Casbin。

安装

创建 thinkphp 项目(如果没有):

composer create-project topthink/think=5.1.* tp5

在ThinkPHP项目里,安装Think-Casbin扩展:

composer require casbin/think-adapter

发布资源:

php think casbin:publish

这将自动创建 model 配置文件config/casbin-basic-model.conf,和 Casbin 的配置文件config/casbin.php。

数据迁移:

由于 Think-Casbin 默认将 Casbin 的策略(Policy)存储在数据库中,所以需要初始化数据库表信息。

执行前,请确保数据库连接信息配置正确,如需单独修改Casbin的数据库连接信息或表名,可以修改config/casbin.php里的配置。

php think casbin:migrate

这将会自动创建 Casbin 的策略(Policy)表casbin_rule。

中间件

ThinkPHP 从5.1.6+版本开始,正式引入中间件的支持。

可以通过命令行指令快速生成中间件

php think make:middleware Authorization

这个指令会application/http/middleware目录下面生成一个Authorization中间件。

在中间件中,获取当前用户名、URI、请求方法,通过Casbin验证权限:

<?php

namespace app\http\middleware;

use Casbin;
use think\facade\Session;

class Authorization
{
    public function handle($request, \Closure $next)
    {
        // 当前登录用户名,这里以session为例
        // $user = Session::get('user_name') ?: 'test_user';
        $user = Session::get('user_name');

        $url = $request->url();
        $action = $request->method();

        if (!$user){
            return response()->data('Unauthenticated.')->code(401);
        }

        if (!Casbin::enforce($user, $url, $action)) {
            return response()->data('Unauthorized.')->code(403);
        }

        return $next($request);
    }
}

Casbin Model 配置

config\casbin-basic-model.conf配置文件:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == p.sub && keyMatch2(r.obj, p.obj) && r.act == p.act

验证

在执行授权之前,先在数据库casbin_rule表中添加一些默认的策略:

id ptype v0 v1 v2
1 p test_user /users GET
2 p test_user /users/:id GET

添加路由及其中间件:

Route::group('users', function () {

    Route::get('', function () {
        return 'Users data.';
    });

    Route::get('/:id', function ($id) {
        return 'User: '.$id;
    });

})->middleware(\app\http\middleware\Authorization::class);

先登录用户保存用户名到SESSION,可以访问/users、/users/1验证一下权限。

以上就是如何使用Casbin作为ThinkPHP的权限控制中间件的详细内容,更多关于使用Casbin作为ThinkPHP的权限控制中间件的资料请关注我们其它相关文章!

(0)

相关推荐

  • Golang之casbin权限管理的实现

    1. 权限管理 Casbin是用于Golang项目的功能强大且高效的开源访问控制库. 1.1.1. 特征 Casbin的作用: 以经典{subject, object, action}形式或您定义的自定义形式实施策略,同时支持允许和拒绝授权. 处理访问控制模型及其策略的存储. 管理角色用户映射和角色角色映射(RBAC中的角色层次结构). 支持内置的超级用户,例如root或administrator.超级用户可以在没有显式权限的情况下执行任何操作. 多个内置运算符支持规则匹配.例如,keyMatc

  • Thinkphp使用Zxing扩展库解析二维码内容图文讲解

    一.下载PHP版本的Zxing扩展库 下载地址:https://github.com/khanamiryan/php-qrcode-detector-decoder 二.使用Zxing扩展库 1.文件下载好后,直接解压,结构如下,我们只需要lib这个文件夹 2.将lib文件夹重命名为Zxing,然后打开Zxing目录下的QrReader.php文件,可以发现命名空间是Zxing 3.接下来就很简单了,把Zxing文件夹放到thnikphp的扩展目录extend里 4.报错 Fatal error

  • laravel与thinkphp之间的区别与优缺点

    Laravel框架: Laravel是当今最熟练,流行和广泛使用的开源框架之一,一直秉承着优雅的原则,完美支持**composer**,实现了更丰富的扩展,社区文档活跃,相较于TP,Lavavel更庞大,安全性也更高,更适合开发大中型项目,被称为"巨匠型开发框架". 问题描述: 1.渲染模版方式的不同 在Laravel框架里,使用return view()来渲染模版:而ThinkPHP里则使用了$this->display()的方式渲染模版. 2.在实际开发中我们常常遇到这样的问

  • PHP Pipeline 实现中间件的示例代码

    Pipeline 设计模式 水管太长,只要有一处破了,就会漏水了,而且不利于复杂环境弯曲转折使用.所以我们都会把水管分成很短的一节一节管道,然后最大化的让管道大小作用不同,因地制宜,组装在一起,满足各种各样的不同需求. 由此得出 Pipeline 的设计模式,就是将复杂冗长的流程 (processes) 截成各个小流程,小任务.每个最小量化的任务就可以复用,通过组装不同的小任务,构成复杂多样的流程 (processes). 最后将「输入」引入管道,根据每个小任务对输入进行操作 (加工.过滤),最

  • thinkphp的钩子的两种配置和两种调用方法

    thinkphp的钩子行为类是一个比较难以理解的问题,网上有很多写thinkphp钩子类的文章,我也是根据网上的文章来设置thinkphp的钩子行为的,但根据这些网上的文章,我在设置的过程中,尝试了十几次都没有成功,不过,我还是没有放弃,最后还是在一边调节细节,一边试验的过程中实现了钩子行为的设置.下面是我个人的设置经验,在这里跟大家分享一下. 个人做了两种设置,都试验成功了,一个简单点,在thinkphp的核心文件中模仿核心行为类添加了另一个行为类,下面是截图: 我的虚拟主机配置文件夹是D:/

  • ThinkPHP6.0如何利用自定义验证规则规范的实现登陆

    1.写在前面 这学期因为各种课内考试,竞赛活动,项目,(和女朋友约会 )

  • Thinkphp5.1获取项目根目录以及子目录路径的方法实例讲解

    导读: 最近使用Thinkphp5.1做开发,在使用LOG_PATH常量(日志路径)时发生报错,因为之前一直使用5.0的框架,换到5.1版本后,出现这种情况,很明白是官方做了调整,所以特地去看了官方说明. 官方文档:https://www.kancloud.cn/manual/thinkphp5_1/ 常量调整 Thinkphp5.1取消了所有的框架内置常量(不影响应用代码中的自定义常量),如需获取,请使用think\facade\App类的内置方法以及think\facade\Env类获取.

  • ThinkPHP的标签制作实例讲解

    thinkphp的默认标签解析器在Lib/Template/TagLib/TagLibCx.class中 里面定义了常用的volist php 等常用thinkphp的标签 这里笔者在这个类中添加一个<category>的标签解析 标签格式: <category parentid='0' ><{$cat.catname}></category> 标签作用: 循环输出父类id是parentid的栏目 1.在tagLibCx.class 的私有属性中添加 'ca

  • thinkphp5.1的model模型自动更新update_time字段实例讲解

    1.model模型开启自动完成时间戳功能 <?php namespace app\common\model; use think\Model; use think\Db; class User extends Model{ //开启自动完成时间戳功能 protected $autoWriteTimestamp = true; } ?> 2.使用update方法更新 User::update(['name'='安阳'],['id'=>1]); Thinkphp中update方法的源代码如下

  • 如何使用Casbin作为ThinkPHP的权限控制中间件

    概述 PHP-Casbin是一个强大的.高效的开源访问控制框架,它支持基于各种访问控制模型的权限管理. Think-Casbin是一个专为 ThinkPHP5.1 定制的 Casbin 的扩展包,使开发者更便捷的在 thinkphp 项目中使用 Casbin. 安装 创建 thinkphp 项目(如果没有): composer create-project topthink/think=5.1.* tp5 在ThinkPHP项目里,安装Think-Casbin扩展: composer requi

  • go语言使用Casbin实现角色的权限控制

    本文主要介绍了go语言使用Casbin实现角色的权限控制,分享给大家,具体如下: 介绍 Casbin 是什么? 官方解释:Casbin是一个强大的.高效的开源访问控制框架,其权限管理机制支持多种访问控制模型. Casbin只负责访问控制.身份认证 authentication(即验证用户的用户名.密码),需要其他专门的身份认证组件负责.例如(jwt-go) 两个核心概念: 访问控制模型model和策略policy. 工作原理: Casbin把 访问控制模型 被抽象为基于 PERM元模型 (Pol

  • ThinkPHP的RBAC(基于角色权限控制)深入解析

    一.什么是RBAC基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注.在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理.在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色.角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收.角色与角色的关系可以

  • thinkphp自定义权限管理之名称判断方法

    权限管理,就是给不同的用户分配不同的权限.当用户登录或者操作时候进行判断,来阻止用户进行权限以外的操作.本次讲的是当用户登录一刻,只显示权限开启的内容. 一.建立数据库. 1.权限表funcla.来存储录入所有权限,也是避免因权限名称修改了,权限失效的问题. 2.管理员表admin.主要存储管理员用户名等信息. 3.管理员对应权限表funadmin.主要存储已开启的管理员id与权限id. 二.输出权限列表. 1.通过管理员列表进入权限分配. 2.权限分配列表. 关于权限分配列表,因为权限板块的不

  • thinkPHP5框架auth权限控制类与用法示例

    本文实例讲述了thinkPHP5框架auth权限控制类.分享给大家供大家参考,具体如下: 这个是比较简单的用法: 直接把类贴出来,这里我改了,我没有用uid,因为我建的表是admin表,所以代码里对应查询改成了aid 还有表名,我都去掉了前缀 <?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] //

  • angular基于路由控制ui-router实现系统权限控制

    前端去实现权限控制听起来有点扯淡(实际也有点扯淡),掩耳盗铃,主要是担心安全问题,但是如果在前后端分离的情况下,需要做一个带有权限控制的后台管理系统,angular基于ui-router应该怎么做呢? 权限的设计中比较常见的就是RBAC基于角色的访问控制,基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合.每一种角色对应一组相应的权限. 一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限.这样做的好处是,不必在每次创建用户时都进行分配

  • ASP.NET对HTML页面元素进行权限控制(二)

    这是这个权限控制的第一步,扫描界面把要分配权限的元素的信息获取出来存入到数据库中. 这一步分三小步: (1).标出界面所要分配权限的元素 (2).扫描界面获取所要分配权限的元素信息.(ID,标题,层级关系) (3).存入数据库中. 1.标出界面所要分配权限的元素. 在扫描的时候一开始我觉得很难因为HTML元素过多又有很多层级关系.一开始用的是<div>标签来表示HTML所要分配权限的元素,发现这个方案不行,比如把添加用户按钮加上DIV那么这个按钮的样式就变了还得调样式我现在做的KS系统有将近1

  • 权限控制之粗粒度与细粒度概念及实现简单介绍

    本文简单介绍了权限控制之粗粒度与细粒度概念及实现,下面看看具体内容. 1.   什么是粗粒度和细粒度权限 粗粒度权限管理,对资源类型的权限管理.资源类型比如:菜单.url连接.用户添加页面.用户信息.类方法.页面中按钮.. 粗粒度权限管理比如:超级管理员可以访问户添加页面.用户信息等全部页面. 部门管理员可以访问用户信息页面包括 页面中所有按钮. 细粒度权限管理,对资源实例的权限管理.资源实例就资源类型的具体化,比如:用户id为001的修改连接,1110班的用户信息.行政部的员工. 细粒度权限管

  • Angular中使用ui router实现系统权限控制及开发遇到问题

    前端去实现权限控制听起来有点扯淡(实际也有点扯淡),掩耳盗铃,主要是担心安全问题,但是如果在前后端分离的情况下,需要做一个带有权限控制的后台管理系统,angular基于ui-router应该怎么做呢? 权限的设计中比较常见的就是RBAC基于角色的访问控制,基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合.每一种角色对应一组相应的权限. 一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限.这样做的好处是,不必在每次创建用户时都进行分配

  • 基于Vue实现后台系统权限控制的示例代码

    用Vue/React这类双向绑定框架做后台系统再适合不过,后台系统相比普通前端项目除了数据交互更频繁以外,还有一个特别的需求就是对用户的权限控制,那么如何在一个Vue应用中实现权限控制呢?下面是我的一点经验. 权限控制是什么 在权限的世界里服务端提供的一切都是资源,资源可以由请求方法+请求地址来描述,权限是对特定资源的访问许可,所谓权限控制,也就是确保用户只能访问到被分配的资源.具体的说,前端对资源的访问通常是由界面上的按钮发起,比如删除某条数据:或由用户进入某一个页面发起,比如获取某个列表数据

随机推荐