Casbin для управления разрешениями GO

задняя часть
Casbin для управления разрешениями GO

Это первый раз, когда я участвую в Gengwen Challenge.25День, подробности о событии уточняйте:Обновить вызов

Casbin для управления разрешениями GO

Давайте вспомним последний раз, когда мы делились в GO.gjsonБиблиотечное приложение и совместное использование, в основном оно обеспечиваеточень быстроа такжеПростойпуть отjsonПолучить соответствующее значение из документа

  • Делитьсяjsonа такжеgjsonчто они представляют
  • gjsonпростое использование
  • gjsonпроверить, получить значение
  • gjsonизjson 行
  • gjsonключевые правила сопоставления путей для
  • gjsonмодификаторы и пользовательские модификаторы

если правильноgjsonЕсли вы заинтересованы, вы можете проверить статьюПрименение и совместное использование gjson в GO

Сегодня давайте поделимся управлением разрешениями в GO,Casbin

Что такое управление разрешениями?

обычно относится кВ соответствии с правилами безопасности или политиками безопасности, установленными системой

Пользователи могут получить доступ и могут получить доступ только к тем ресурсам, к которым у них есть доступ, не более и не менее

Управление привилегиями есть практически в любой системе

мы могли бы поставить用户身份认证,密码加密,系统管理а такжеуправление полномочиямиСмущенный, какова их конкретная направленность?

  • аутентификация пользователя

Не относится к категории управления правами

Под аутентификацией пользователя понимается подтверждение вашей личности с помощью определенных учетных данных, таких как пароль учетной записи, отпечаток пальца, распознавание лица и т. д.

  • Управление системой

Это модуль в системе. Этот модуль обычно также содержит подмодуль управления полномочиями. Этот модуль эквивалентен предоставлению некоторых данных в модуль управления полномочиями.

  • шифрование пароля

Это также не относится к категории управления правами, это только часть поля аутентификации пользователя.

Что такое Касбин?

— мощная и эффективная библиотека управления доступом с открытым исходным кодом для проекта GO,casbinПоддерживает различные широко используемые модели управления доступом, такие как:

  • RBAC
  • ABAC
  • ACL

использовать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а также拦截器Если вам интересно, вы можете просмотреть статью

Суммировать

  • поделился, что такое управление разрешениями
  • что такое кабин
  • Особенности Касбина
  • Кейсы для Casbin

Добро пожаловать лайк, подписка, избранное

Друзья, ваша поддержка и поощрение мотивируют меня продолжать делиться и улучшать качество.

Хорошо, вот и на этот раз,В следующий раз Как серверная часть обеспечивает работу API? свагго это хорошо

Технологии открыты, и наш менталитет должен быть открытым. Примите перемены, живите на солнце и двигайтесь вперед.

ямаленький дьяволенок Нежа, добро пожаловать, лайкайте, подписывайтесь и добавляйте в избранное, увидимся в следующий раз~