Перейти к основному контенту

Как начать

Установка

go get github.com/casbin/casbin/v2

Новый силуэт Касбина

Casbin uses configuration files to define the access control model.

There are two configuration files: model.conf and policy.csv. model.conf stores the access model, while policy.csv stores the specific user permission configuration. The usage of Casbin is very straightforward. We only need to create one main structure: enforcer. При построении этой структуры будут загружены model.conf и policy.csv.

In other words, to create a Casbin enforcer, you need to provide a Model and an Adapter.

Casbin provides a FileAdapter that you can use. See Adapter for more information.

  • Example of using the Model file and the default FileAdapter:
import "github.com/casbin/casbin/v2"

e, err := casbin.NewEnforcer("path/to/model.conf", "path/to/policy.csv")
  • Используйте текст модели с другим адаптером:
import (
"log"

"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
xormadapter "github.com/casbin/xorm-adapter/v2"
_ "github.com/go-sql-driver/mysql"
)

// Инициализация Xorm адаптера с базой данных MySQL.
a, err := xormadapter.NewAdapter("mysql", "mysql_username:mysql_password@tcp(127.0.0.1:3306)/")
if err != nil {
log.Fatalf("error: adapter: %s", err)
}

m, err := model.NewModelFromString(`
[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
`)
if err != nil {
log.Fatalf("error: model: %s", err)
}

e, err := casbin.NewEnforcer(m, a)
if err != nil {
log.Fatalf("error: enforcer: %s", err)
}

Проверить права доступа

Добавьте вызов энфорсера в свой код там, где необходимо контролировать доступ:

sub := "alice" // пользователь, который хочет получить доступ к ресурсу.
obj := "data1" // ресурс, доступ к которому запрашивается.
act := "read" // действие, которое совершает пользователь над ресурсом.

ok, err := e. nforce(sub, obj, act)

если err ! nil {
// обработка err
}

if ok == true {
// разрешить alice к чтению данных 1
} else {
// отрицаем запрос, показать ошибку
}

// Вы можете использовать BatchEnforce() для применения некоторых запросов в пакетах.
// Этот метод возвращает маску буля, и этот индекс ломтика соответствует индексу строк двухмерного массива.
// например, результаты[0] — это результат {"alice", "data1", "read"}
results, err := e.BatchEnforce([][][]interface{}{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"jack", "data3", "read"}})

Касбин также предоставляет API для управления разрешениями во время выполнения. Например, вы можете получить все роли, назначенные пользователю как ниже:

roles, err := e.GetRolesForUser("alice")

Смотрите Management API и RBAC API для большего использования.

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