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模拟访问,输出如下:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
02月19日云栖号头条:阿里云华南最大数据中心开服
云栖号:https://yqh.aliyun.com第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 今日最新云头条快讯: 近日,阿里云在官网宣布,河源数据中心正式对外提供服务。这是华南地区规模最大的绿色数据中心,可容纳超过30万台服务器,作为深圳地域的新可用区为华南地区上百万企业客户提供云计算、人工智能、物联网等服务;国家卫健委高级别专家组组长、中国工程院院士钟南山表示,初步估计,二月中或者二月中下旬一点,就南方来说,应该达到峰值了:“达到峰值不见得说它马上会下降。 一起来看最新的资讯: 阿里云华南最大数据中心开服 据悉,河源数据中心采用了目前业内最先进的硬件设备,并大规模应用飞天操作系统、第三代神龙架构、盘古存储等自研云计算技术,可用区内时延仅为其他数据中心的40%左右,可轻松应对金融级企业的海量扩容需求。其中,神龙架构是阿里云在底层硬件层面的重大突破,通过自研的虚拟化技术,神龙云融合了物理机和虚拟机的优势,用户能在云上获得物理机100%的计算能力,目前已全面支持ECS虚拟机、裸金属、云原生容器等,并较上一代在IOPS、PPS等方...
- 下一篇
Spring Batch 小任务(Tasklet)步骤
Chunk-Oriented Processing不是处理 step 的唯一方法。 考虑下面的一个场景,如果你仅仅需要调用一个存储过程,你可以在ItemReader 中实现这个调用,然后在存储过程完成调用后返回 null。这种设计看起来不是那么自然也不是非常优美,因为你的批量设计中甚至都不需要实现 ItemWriter。针对这种情况,Spring Batch 为你提供了 TaskletStep 选项。 TaskletStep 是一个简单的接口,这个接口只需要实现一个方法execute,这个方法将会被TaskletStep多次重复的调用,直到这个方法返回 RepeatStatus.FINISHED 或者抛出异常来表示调用失败。 Tasklet 的每一次调用都会包含在事务中(Transaction)。Tasklet 的实现(implementors)可以调用一个存储过程,一个脚本或者一个简单的 SQL 更新脚本。 针对我们的实践中,我们可以使用 Tasklet 来执行一个 FTP 的任务。 将我们产生的中间文件上传到不同的 FTP 服务器上,你可以在实现中指定不同的服务器配置参数,这样更加...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果