一、概述
上一讲我们已经讲了基础的策略管理。用配置文件来管理,在大型项目里肯定是不够的。所以这一讲我们讲一下用数据库来进行策略管理,我们选择Mysql。官方网站也给我们推荐了对应的适配器:
我们选择Grom这个适配器来进行管理,主要是我们后期使用gin框架,这个比较习惯:
二、添加适配器代码
1、代码目录结构:
我们在上次演示代码的基础上添加一个dao目录,用来添加grom连接,代码结构如下:
2、添加的db.go连接器:
package dao
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
const (
Usernname = "root"
Password = "123456"
Host = "172.22.6.82"
Port = "3306"
Db = "casbin"
)
var Gorm *gorm.DB
func init() {
Gorm = InitGorm()
}
func InitGorm() *gorm.DB {
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", Usernname, Password, Host, Port, Db)
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal(err)
}
mysqlDB, err := db.DB()
if err != nil {
log.Fatal(err)
}
mysqlDB.SetMaxIdleConns(5)
mysqlDB.SetMaxOpenConns(10)
return db
}
三、修改我们的main代码:
package main
import (
"casbin-project/dao"
"fmt"
"github.com/casbin/casbin/v2"
gormadapter "github.com/casbin/gorm-adapter/v3"
)
func main() {
sub := "test"
obj := "/posts"
act := "POST"
a, err := gormadapter.NewAdapterByDB(dao.Gorm)
e, err := casbin.NewEnforcer("resources/model.conf", a)
checkError(err)
ok, err := e.Enforce(sub, obj, act)
checkError(err)
if ok {
fmt.Println("通过!")
} else {
fmt.Println("不通过!")
}
}
// 统一错误检查
func checkError(err error) {
if err != nil {
println(err.Error())
}
}
#执行一下我们这个代码,默认会在casbin这个数据库下生成一个:casbin_rule表默认表结构是空的:
我们执行代码现在是不通过的(以为我们的策略表现在是空的),下面我们给代码添加一条校验规则:test用户访问 /post资源执行POST方法:
四、执行插入策略:
1、执行: e.AddPolicy(sub, obj, act)添加策略
package main
import (
"casbin-project/dao"
"fmt"
"github.com/casbin/casbin/v2"
gormadapter "github.com/casbin/gorm-adapter/v3"
)
func main() {
sub := "test"
obj := "/posts"
act := "POST"
a, err := gormadapter.NewAdapterByDB(dao.Gorm)
e, err := casbin.NewEnforcer("resources/model.conf", a)
checkError(err)
added, err := e.AddPolicy(sub, obj, act)
fmt.Println(added)
ok, err := e.Enforce(sub, obj, act)
checkError(err)
if ok {
fmt.Println("通过!")
} else {
fmt.Println("不通过!")
}
}
// 统一错误检查
func checkError(err error) {
if err != nil {
println(err.Error())
}
}
##我们再次执行发现已经是OK了,可以解析通过,我们看一下数据库是否已经变化:
#可以看到已经插入成功了相关的策略。到此用数据库来管理规则已经完成,当然还有更多优秀的API我们可以自行如下
五、更多的API管理:
1、我们可以调用:e.RemovePolicy()加规则名:
rmed, err := e.RemovePolicy(sub, obj, act)
2、可以一次性添加多条规则:
rules := [][]string{
[]string{"admin", "/post", "POST"},
[]string{"test", "/test", "GET"},
[]string{"test", "/test", "POST"},
[]string{"xiaoluo", "/data", "GET"},
}
areRulesAdded, _ := e.AddPolicies(rules)
fmt.Println(areRulesAdded)
3、删除多条规则同理:
rmed, err := e.RemovePolicies(rules)
六、总结完善:
官网提供了很多丰富的API接口文档,但是实际测试下来我们也发现:add添加规则等,照抄会报错。我们自己可以用goland查看一下源码看一下参数之类的进行修改。最后我们发现实际应用当中还有几个需要完善的地方例如:我们知道了casbin可以进行权限判断,那么在实际项目如何使用:例如gin框架,我们该如何操作呢。后续有时间我们在简单整合一些拦截路由的小例子。