实现权限控制_在 Go 语言中使用 casbin 实现基于角色的 HTTP 权限控制
Go语言中文网,致力于每日分享编码、开源等知识,欢迎关注我,会有意想不到的收获!
身份认证和授权对 web 应用的安全至关重要。最近,我用 Go 完成了我的第一个正式的 web 应用,这篇文章是在这个过程中我所学到的部分内容。
本文中,我们的关注点在于如何在 web 应用中使用开源的 casbin 库进行 HTTP 权限控制。同时,在示例代码中我们使用了 scs 库进行 session 管理。
下面的例子十分基础,希望它尽可能的展示了如何在 Go web 应用中实现权限控制。为了更侧重于展示 casbin 的使用,我们尽量简化业务逻辑(例如:不需密码的登陆操作)。我们一起来看一下!
注意:请不要在生产环境中使用所示的用例代码,该例子侧重于描述清晰,而不是安全性。
建立
首先,我们创建一个 User 模型,并实现了相应方法:
type User struct { ID int Name string Role string}type Users []Userfunc (u Users) Exists(id int) bool { ...}func (u Users) FindByName(name string) (User, error) { ...}
接着配置 casbin 所需文件。这里我们需要一个配置文件和一个策略文件。配置文件使用 PERM 元模型。PERM 表示策略(Policy)、效果(Effect)、请求(Request)和匹配器(Matchers)。
在 auth_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 && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")
其中定义了请求和策略来表示主体,客体和动作。在本例中,主体表示用户角色,客体表示访问路径,action 表示请求方法(例:GET, POST 等)。
匹配器定义了策略是如何匹配的,可以通过直接定义主体,或者使用像 keyMatch 这样的帮助方法,它也可以匹配通配符。casbin 实际比这个简单的例子要强大得多,你可以用声明的方式定义各种自定义功能来达到轻松切换和维护鉴权配置的效果。
在安全性方面,我通常会选择最简单的解决方案,因为当系统开始变复杂和难以维护时,错误就开始发生。
在这个例子中,策略文件就是一个简单的 csv 文件,描述了哪些角色可以访问哪些路径等。
policy.csv 文件格式如下:
p, admin, /*, *p, anonymous, /login, *p, member, /logout, *p, member, /member/*, *
这个配置文件十分简单。在这个例子中,我们简单的定义了 admin 角色可以访问所有内容,member 角色可以访问以 /member/ 开头的路径和 logout 路径,未认证用户可以登陆。
这种形式的好处在于即使应用具有许多规则和用户角色,它仍然是可维护的。
执行
让我们从 main 函数开始,将所有的东西都配置好,并启动 http 服务器:
func main() { // setup casbin auth rules authEnforcer, err := casbin.NewEnforcerSafe("./auth_model.conf
实现权限控制_在 Go 语言中使用 casbin 实现基于角色的 HTTP 权限控制相关推荐
- Jenkins配置基于角色的项目权限管理--转
本文将介绍如何配置jenkins,使其可以支持基于角色的项目权限管理. 由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,本文将使用Role Str ...
- RBAC(基于角色的访问控制权限的基本模型)
(一)基本概念 1.定义 RBAC(Role-Based Access Control),也就是所谓的**"基于角色的访问控制权限"**. 2.优势 在RBAC中,用户不再直接与权 ...
- golang go语言_在Go语言中无需反思即可使用Lodash的好处
golang go语言 by Tal Kol 通过塔尔科尔 在Go语言中无需反思即可使用Lodash的好处 (The benefits of using Lodash in the Go langua ...
- java语言变量分为_在Java语言中变量分为四种,分别是___________________________________________。_学小易找答案...
[填空题]One day, at the registrar's office of a college, I noticed how parents are behaving with their ...
- mysql 查看用户权限_在Navicat Premium中管理MySQL用户 - 第4部分:权限管理器工具
更多资源请查看:[Navicat使用教程2019.1] | [Navicat Data Modeler使用教程] 第4部分:Privilege Manager(权限管理器)工具 在本系列教程中,我们一 ...
- 在c语言中log函数的作用,C++_在C语言中使用对数函数的方法,C语言log()函数:返回以e为底的 - phpStudy...
在C语言中使用对数函数的方法 C语言log()函数:返回以e为底的对数值头文件: #include log() 函数返回以 e 为底的对数值,其原型为: double log (double x); ...
- r语言 rgl 强制过程中_一个R语言中操纵矢量空间数据的标准化工具—sf
注: 本文是R语言sf包的核心开发者和维护者--来自德国明斯特大学的地理信息学教授:Edzer Pebesma 的一篇关于sf包的简介,发表于2018年7月的R语言期刊,主要讲述了sf的定位.功能. ...
- java任何表达式都可以当作语句_在Java语言中语句用分号终止,并不是所有的表达式都可以构成语句...
在Java语言中,语句以分号":"作为结束标志.块语句由其他语句组成,其本身不需要用分号结尾.另外,内嵌有块语句并以块语句结尾的语句,也不需要用分号结尾. Java语句可分为空语句 ...
- 函数使用了堆栈的字节超过_在C语言中如何访问堆栈?
堆栈一般是用来保存变量之类的东西(静态变量在内存中,虽然堆栈就是内存的一部分,但为了防止歧义,还是分成两部分来说),一般情况下没必要去故意读取堆栈的值,变量用变量名就可以直接访问,但我曾经想要读取函数 ...
最新文章
- 定域性和实在性之矛盾的世界
- [CISCN2018]crackme-java
- c语文编程提取郑码的单字码表
- 你想过没有,学校从来没教过你怎么赚钱
- c\c++中比较两个字符串或string对象是否相等
- 基于matlab的光伏电池通用数学模型,基于MATLAB的光伏电池通用数学模型.doc
- Python语言核心编程
- Android 刷机脚本工具箱
- c语言开发环境win10,老司机解决win10系统搭建C语言开发环境的操作技巧
- 超越授权使用计算机,提供侵入、非法控制计算机信息系统程序、工具罪
- 音乐外链php修复版源码
- 8088CPU有多少根数据线和地址线?为什么8根数据线却说是16位数据线?
- vs和clion工具下建立qt widgets项目
- LInux下Mplayer字幕乱码,日文字体部分乱码解决方案
- 身边策神 振江 刘盛义等等
- my ReadHumor work / youmo
- 光模块尾号字母的意思
- 开源 java CMS - FreeCMS2.8 评论管理
- 原声JS瀑布流加延迟载入
- 简述自然语言理解的层次划分及对应的技术