주요 콘텐츠로 건너뛰기

Model Storage

정책과 달리, 모델은 로드만 가능하며 저장할 수 없습니다. 모델이 동적 컴포넌트가 아니며 런타임에 수정되어서는 안 된다고 생각하기 때문에, 모델을 저장소에 저장하는 API를 구현하지 않았습니다.

그러나, 좋은 소식이 있습니다. 모델을 정적 또는 동적으로 로드하는 세 가지 동등한 방법을 제공합니다:

.CONF 파일에서 모델 로드

이것이 Casbin을 사용하는 가장 일반적인 방법입니다. 이것은 초보자에게 이해하기 쉽고 Casbin 팀의 도움이 필요할 때 공유하기 편리합니다.

.CONF 파일 examples/rbac_model.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

그런 다음 다음과 같이 모델 파일을 로드할 수 있습니다:

e := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")

코드에서 모델 로드

모델은 .CONF 파일을 사용하는 대신 코드에서 동적으로 초기화될 수 있습니다. 다음은 RBAC 모델에 대한 예입니다:

import (
"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
"github.com/casbin/casbin/v2/persist/file-adapter"
)

// Initialize the model from Go code.
m := model.NewModel()
m.AddDef("r", "r", "sub, obj, act")
m.AddDef("p", "p", "sub, obj, act")
m.AddDef("g", "g", "_, _")
m.AddDef("e", "e", "some(where (p.eft == allow))")
m.AddDef("m", "m", "g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act")

// Load the policy rules from the .CSV file adapter.
// Replace it with your adapter to avoid using files.
a := fileadapter.NewAdapter("examples/rbac_policy.csv")

// Create the enforcer.
e := casbin.NewEnforcer(m, a)

문자열에서 모델 로드

또는, 여러 줄의 문자열에서 전체 모델 텍스트를 로드할 수 있습니다. 이 방법의 장점은 모델 파일을 유지할 필요가 없다는 것입니다.

import (
"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
)

// Initialize the model from a string.
text :=
`
[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
`
m, _ := model.NewModelFromString(text)

// Load the policy rules from the .CSV file adapter.
// Replace it with your adapter to avoid using files.
a := fileadapter.NewAdapter("examples/rbac_policy.csv")

// Create the enforcer.
e := casbin.NewEnforcer(m, a)