Это первый раз, когда я участвую в Gengwen Challenge.25День, подробности о событии уточняйте:Обновить вызов
Casbin для управления разрешениями GO
Давайте вспомним последний раз, когда мы делились в GO.gjsonБиблиотечное приложение и совместное использование, в основном оно обеспечиваеточень быстроа такжеПростойпуть отjsonПолучить соответствующее значение из документа
- Делиться
jsonа такжеgjsonчто они представляют -
gjsonпростое использование -
gjsonпроверить, получить значение -
gjsonизjson 行 -
gjsonключевые правила сопоставления путей для -
gjsonмодификаторы и пользовательские модификаторы
если правильноgjsonЕсли вы заинтересованы, вы можете проверить статьюПрименение и совместное использование gjson в GO
Сегодня давайте поделимся управлением разрешениями в GO,Casbin
Что такое управление разрешениями?
обычно относится кВ соответствии с правилами безопасности или политиками безопасности, установленными системой
Пользователи могут получить доступ и могут получить доступ только к тем ресурсам, к которым у них есть доступ, не более и не менее
Управление привилегиями есть практически в любой системе
мы могли бы поставить用户身份认证,密码加密,系统管理а такжеуправление полномочиямиСмущенный, какова их конкретная направленность?
- аутентификация пользователя
Не относится к категории управления правами
Под аутентификацией пользователя понимается подтверждение вашей личности с помощью определенных учетных данных, таких как пароль учетной записи, отпечаток пальца, распознавание лица и т. д.
- Управление системой
Это модуль в системе. Этот модуль обычно также содержит подмодуль управления полномочиями. Этот модуль эквивалентен предоставлению некоторых данных в модуль управления полномочиями.
- шифрование пароля
Это также не относится к категории управления правами, это только часть поля аутентификации пользователя.
Что такое Касбин?
— мощная и эффективная библиотека управления доступом с открытым исходным кодом для проекта GO,casbinПоддерживает различные широко используемые модели управления доступом, такие как:
RBACABACACL
использоватьcasbinЛучшее место для управления разрешениями,casbinОн поддерживает несколько языков, точно так же, как protobuf также поддерживает несколько языков.
Давайте посмотрим на особенности Casbin
- Стратегия реализации такая
{subject, object, action},
Мы также можем настроить, и он поддерживает разрешение авторизации и отказ в авторизации
- он может справитьсяМодель контроля доступа и соответствующая политика ее хранения
- существует
RBACВ иерархии ролей в , он может управлять сопоставлением ролей пользователей и сопоставлением ролей. - Он поддерживает встроенныйкорень
Такие какrootилиadministrator
- Поддерживает сопоставление нескольких встроенных правил операторов.
Напримерhello/world, его можно сопоставить сhello*模式
- Аутентификация не поддерживается
- Не поддерживает управление списками пользователей или ролей
Давайте взглянемCasbinбазовая модель
существуетCasbinбиблиотека, он основан наPERMМетамодель абстрагирует модель управления доступом в файл CONF, который выглядит следующим образом.4части
- Стратегия
- Эффект
- просить
- сопоставитель
Давайте рассмотрим одну из самых простых моделей,ACLизCONFМодель
#请求定义
[request_definition]
r = sub, obj, act
#策略定义
[policy_definition]
p = sub, obj, act
#角色定义
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
НапримерACLПримеры политик для моделей
p, xiaomt, data1, read
p, xiaomt, data2, write
Давайте напишем ДЕМО
-
main.goзапись в файлginсоответствующий интерфейс иcasbinиспользование -
rbac_models.confФайл конфигурации RBAC
Напишем маршрут, добавим перехватчик и напишем интерфейс/api/v1/hello, используйте метод GET для проверки эффекта
package main
import (
"fmt"
"log"
"github.com/casbin/casbin"
xd "github.com/casbin/xorm-adapter"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
)
// myAuth 拦截器
func myAuth(e *casbin.Enforcer) gin.HandlerFunc {
return func(c *gin.Context) {
obj := c.Request.URL.RequestURI()
// 获取方法
act := c.Request.Method
sub := "root"
// 判断策略是否已经存在了
if ok := e.Enforce(sub, obj, act); ok {
log.Println("Check successfully")
c.Next()
} else {
log.Println("sorry , Check failed")
c.Abort()
}
}
}
func main() {
// 使用自己定义rbac_db
// 最后的一个参数咱们写true ,否则默认为false,使用缺省的数据库名casbin,不存在则创建
a := xd.NewAdapter("mysql", "root:123456@tcp(127.0.0.1:3306)/mycasbin?charset=utf8", true)
e := casbin.NewEnforcer("./rbac_models.conf", a)
//从DB中 load 策略
e.LoadPolicy()
//new 一个路由
r := gin.New()
r.POST("/api/v1/add", func(c *gin.Context) {
log.Println("add a policy")
if ok := e.AddPolicy("root", "/api/v1/hello", "GET"); !ok {
log.Println("The strategy already exists")
} else {
log.Println("add successfully ...")
}
})
//使用自定义拦截器中间件,每一个接口的访问,都会通过这个拦截器
r.Use(myAuth(e))
//创建请求
r.GET("/api/v1/hello", func(c *gin.Context) {
fmt.Println("hello wolrd")
})
// 监听 127。0.0.1:8888
r.Run(":8888")
}
для вышеперечисленногоxd.NewAdapterДля операции чтения данных мы можем посмотреть на конкретную реализацию
Конкретный исходный код находится в"github.com/casbin/xorm-adapter"серединаadapter.go
// NewAdapter is the constructor for Adapter.
// dbSpecified is an optional bool parameter. The default value is false.
// It's up to whether you have specified an existing DB in dataSourceName.
// If dbSpecified == true, you need to make sure the DB in dataSourceName exists.
// If dbSpecified == false, the adapter will automatically create a DB named "casbin".
func NewAdapter(driverName string, dataSourceName string, dbSpecified ...bool) *Adapter {
a := &Adapter{}
a.driverName = driverName
a.dataSourceName = dataSourceName
if len(dbSpecified) == 0 {
a.dbSpecified = false
} else if len(dbSpecified) == 1 {
a.dbSpecified = dbSpecified[0]
} else {
panic(errors.New("invalid parameter: dbSpecified"))
}
// Open the DB, create it if not existed.
a.open()
// Call the destructor when the object is released.
runtime.SetFinalizer(a, finalizer)
return a
}
посмотри сноваcasbin.NewEnforcer
Исходные файлы находятся в"github.com/casbin/casbin"серединаenforcer.go
NewEnforcerСоздав файл или БДenforcer, ниже официальное письмо, обратите внимание на следующие случаи
// e := casbin.NewEnforcer("path/to/basic_model.conf", "path/to/basic_policy.csv")
// MySQL DB:
// a := mysqladapter.NewDBAdapter("mysql", "mysql_username:mysql_password@tcp(127.0.0.1:3306)/")
// e := casbin.NewEnforcer("path/to/basic_model.conf", a)
func NewEnforcer(params ...interface{}) *Enforcer {
e := &Enforcer{}
parsedParamLen := 0
// 判断参数个数
if len(params) >= 1 {
enableLog, ok := params[len(params)-1].(bool)
if ok {
e.EnableLog(enableLog)
parsedParamLen++
}
}
// 省略 部分代码
return e
}
Приведенный выше код, если вам интересно, вы можете вставить код в свою среду.
использовать что-то вродеpostmanИнструменты для доступа к интерфейсу и просмотра эффекта, необходимо его настроитьmysqlбаза данных
для вышеперечисленногоginа также拦截器Если вам интересно, вы можете просмотреть статью
- Поделитесь волной алгоритмов маршрутизации джина
- Взгляните на перехватчики gRPC
- Джин боевая тренировка
Суммировать
- поделился, что такое управление разрешениями
- что такое кабин
- Особенности Касбина
- Кейсы для Casbin
Добро пожаловать лайк, подписка, избранное
Друзья, ваша поддержка и поощрение мотивируют меня продолжать делиться и улучшать качество.
Хорошо, вот и на этот раз,В следующий раз Как серверная часть обеспечивает работу API? свагго это хорошо
Технологии открыты, и наш менталитет должен быть открытым. Примите перемены, живите на солнце и двигайтесь вперед.
ямаленький дьяволенок Нежа, добро пожаловать, лайкайте, подписывайтесь и добавляйте в избранное, увидимся в следующий раз~