본문으로 건너뛰기

시작하기

설치​

go get github.com/casbin/casbin/v3
v2에서 v3으로 마이그레이션

Casbin v2에서 v3으로 업그레이드하는 경우, 가져오기 경로를 github.com/casbin/casbin/v2에서 github.com/casbin/casbin/v3(으)로 업데이트하세요. 이는 모든 하위 패키지에도 적용됩니다(예: v2/model은 v3/model이 됨).

Go 모듈의 경우 다음을 실행하세요:

go get -u github.com/casbin/casbin/v3

그러면 코드 내의 모든 가져오기를 /v2에서 /v3(으)로 업데이트하세요.

Casbin Enforcer 생성하기​

Casbin은 접근 제어 모델을 지정하기 위해 구성 파일에 의존합니다.

두 개의 구성 파일이 필요합니다: model.conf와 policy.csv. Model 파일은 접근 제어 모델을 정의하고, Policy 파일에는 권한 규칙이 포함됩니다. 실제로는 두 파일을 모두 로드하는 단일 컴포넌트인 Enforcer를 사용합니다.

Enforcer를 생성하려면 Model과 Adapter를 제공하세요.

Casbin은 사용할 수 있는 FileAdapter를 제공합니다. 자세한 내용은 Adapter를 참조하세요.

  • 기본 FileAdapter를 사용하는 Model 파일 예시:
import "github.com/casbin/casbin/v3"

e, err := casbin.NewEnforcer("path/to/model.conf", "path/to/policy.csv")
  • 대체 Adapter를 사용하는 Model 텍스트 예시:
import (
"log"

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

// Initialize a Xorm adapter with MySQL database.
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" // the user that wants to access a resource.
obj := "data1" // the resource that is going to be accessed.
act := "read" // the operation that the user performs on the resource.

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

if err != nil {
// handle err
}

if ok == true {
// permit alice to read data1
} else {
// deny the request, show an error
}

// You could use BatchEnforce() to enforce some requests in batches.
// This method returns a bool slice, and this slice's index corresponds to the row index of the two-dimensional array.
// e.g. results[0] is the result of {"alice", "data1", "read"}
results, err := e.BatchEnforce([][]interface{}{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"jack", "data3", "read"}})

Casbin은 런타임 권한 관리를 위한 API를 제공합니다. 예를 들어, 사용자에게 할당된 모든 역할을 검색할 수 있습니다:

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

더 많은 예제는 Management API 및 RBAC API를 참조하세요. 각 언어 저장소의 테스트 케이스도 살펴볼 수 있습니다.

Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.