首页 文章 精选 留言 我的

精选列表

搜索[远程控制软件],共10000篇文章
优秀的个人博客,低调大师

Casbin+Gin+XORM的权限控制demo(三)

之前的两篇文章,我们做demo的时候,把所有的代码都写在main.go里.在进一步深入学习casbin之前,把代码做一次重构.重构完成后,目录结构是这样的: 首先,把配置文件rbac_models.conf移到conf目录下. 其次,把main.go初始化casbin的代码,放到service/casbin.go里,代码如下: package service import ( "log" "github.com/casbin/casbin/v2" xormadapter "github.com/casbin/xorm-adapter/v2" _ "github.com/go-sql-driver/mysql" ) var Enforcer *casbin.Enforcer // 初始化casbin func CasbinSetup() { a, err := xormadapter.NewAdapter("mysql", "rbac:123456@tcp(127.0.0.1:3306)/rbac_db?charset=utf8", true) if err != nil { log.Printf("连接数据库错误: %v", err) return } e, err := casbin.NewEnforcer("conf/rbac_models.conf", a) if err != nil { log.Printf("初始化casbin错误: %v", err) return } Enforcer = e } 第三步,把main.go里关于拦截器的部分,放到middleware/middleware.go里,代码如下: package middleware import ( "demo/service" "fmt" "github.com/gin-gonic/gin" ) //拦截器 func Authorize() gin.HandlerFunc { return func(c *gin.Context) { // var e *casbin.Enforcer e := service.Enforcer //从DB加载策略 e.LoadPolicy() //获取请求的URI obj := c.Request.URL.RequestURI() //获取请求方法 act := c.Request.Method //获取用户的角色 sub := "admin" //判断策略中是否存在 if ok, _ := e.Enforce(sub, obj, act); ok { fmt.Println("恭喜您,权限验证通过") c.Next() } else { fmt.Println("很遗憾,权限验证没有通过") c.Abort() } } } 第四步,把main.go里的 r.GET("/api/v1/hello", func(c *gin.Context) { fmt.Println("Hello 接收到GET请求..") }) 这部分代码,放到controller/hello.go里,代码如下: package controller import ( "fmt" "net/http" "github.com/gin-gonic/gin" ) func Hello(c *gin.Context) { fmt.Println("Hello 接收到GET请求..") c.JSON(http.StatusOK, gin.H{ "code": 200, "msg": "Success", "data": "Hello 接收到GET请求..", }) } 第五步,把main.go里路由部分的代码,放到routers/router.go里,代码如下: package routers import ( "demo/controller" "demo/middleware" "github.com/gin-gonic/gin" ) func InitRouter() *gin.Engine { //获取router路由对象 r := gin.New() //使用自定义拦截器中间件 r.Use(middleware.Authorize()) //创建请求 r.GET("/api/v1/hello", controller.Hello) return r } 经过这样改造后,main.go里的内容就少多了: package main import ( "demo/routers" "demo/service" ) func init() { service.CasbinSetup() } func main() { r := routers.InitRouter() r.Run(":9000") //参数为空 默认监听8080端口 } 最后使用postman模拟访问,输出如下:

优秀的个人博客,低调大师

Casbin+Gin+XORM的权限控制demo(二)

casbin的增删查(casbin没有update的API,如果需要更新policy,那么只有先删除再添加) 还是直接上代码 package main import ( "fmt" "log" "github.com/casbin/casbin/v2" xormadapter "github.com/casbin/xorm-adapter/v2" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" ) func main() { a, err := xormadapter.NewAdapter("mysql", "rbac:123456@tcp(127.0.0.1:3306)/rbac_db?charset=utf8", true) if err != nil { log.Printf("连接数据库错误: %v", err) return } e, err := casbin.NewEnforcer("rbac_models.conf", a) if err != nil { log.Printf("初始化casbin错误: %v", err) return } //从DB加载策略 e.LoadPolicy() //获取router路由对象 r := gin.New() //增加policy r.POST("/api/v1/add", func(c *gin.Context) { fmt.Println("增加Policy") if ok, _ := e.AddPolicy("admin", "/api/v1/world", "GET"); !ok { fmt.Println("Policy已经存在") } else { fmt.Println("增加成功") } }) //删除policy r.DELETE("/api/v1/delete", func(c *gin.Context) { fmt.Println("删除Policy") if ok, _ := e.RemovePolicy("admin", "/api/v1/world", "GET"); !ok { fmt.Println("Policy不存在") } else { fmt.Println("删除成功") } }) //获取policy r.GET("/api/v1/get", func(c *gin.Context) { fmt.Println("查看policy") list := e.GetPolicy() for _, vlist := range list { for _, v := range vlist { fmt.Printf("value: %s, ", v) } } }) //使用自定义拦截器中间件 r.Use(Authorize(e)) //创建请求 r.GET("/api/v1/hello", func(c *gin.Context) { fmt.Println("Hello 接收到GET请求..") }) r.Run(":9000") //参数为空 默认监听8080端口 } //拦截器 func Authorize(e *casbin.Enforcer) gin.HandlerFunc { return func(c *gin.Context) { //获取请求的URI obj := c.Request.URL.RequestURI() //获取请求方法 act := c.Request.Method //获取用户的角色 sub := "admin1" //判断策略中是否存在 if ok, _ := e.Enforce(sub, obj, act); ok { fmt.Println("恭喜您,权限验证通过") c.Next() } else { fmt.Println("很遗憾,权限验证没有通过") c.Abort() } } }

优秀的个人博客,低调大师

扩展Python控制台实现中文反馈信息

"中文编程"知乎专栏原文地址 参考了周蟒的实现, 运行效果如下: $ python3 解释器.py Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 05:52:31) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin Type "help", "copyright", "credits" or "license" for more information. (ZhPyConsole) >>> 学 Traceback (most recent call last): File "<console>", line 1, in <module> 命名错误: 命名'学'未定义 >>> for i in range(1,4): ... 生 ... Traceback (most recent call last): File "<console>", line 2, in <module> 命名错误: 命名'生'未定义 完整源码在: 解释器.py 相关源码如下, 即改写InteractiveInterpreter.showtraceback方法. 仅为演示之用, 直接用了字符串替换.: def showtraceback(self): sys.last_type, sys.last_value, last_tb = ei = sys.exc_info() sys.last_traceback = last_tb try: 行 = traceback.format_exception(ei[0], ei[1], last_tb.tb_next) 汉化行 = [] if sys.excepthook is sys.__excepthook__: for 某行 in 行: for 英文 in self.字典: 某行 = 某行.replace(英文, self.字典[英文]) 汉化行.append(某行) self.write(''.join(汉化行)) else: # If someone has set sys.excepthook, we let that take precedence # over self.write sys.excepthook(ei[0], ei[1], last_tb) finally: last_tb = ei = None 定制sys.excepthook貌似更为合适, 还需研究如何实现. 参考资料 周蟒-zhpy 2019-02-10

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册