Ana içeriğe geç

Yerel Erişim Kontrolü

Bu eğitimde, kova ve nesnelerinizi yönetmek için go-SDK kütüphanesini kullanacağız.

Ön Gereksinimler

Başlamadan önce, aşağıdakilerle tanışık olmalısınız:

  • Greenfield temelleri
  • Greenfield komut satırı örnekleri

Erişim Kontrolü Özellikleri

AnahtarEtkisiEylemlerKaynaklarSüre
Hesaplar/Grupİzin Ver/DüşünUpdateBucketInfo, DeleteBucket, vbKova
Hesaplar/Grupİzin Ver/DüşünCreateObject, DeleteObject, CopyObject, GetObject, ExecuteObject, vbNesne
Hesaplar/Grupİzin Ver/DüşünUpdateGroupMember, DeleteGroup, vbGrup

Kurulum

Go Projesi Oluşturma

Gerekli bağımlılıklarla bir Go projesi oluşturalım.

Başlat

$ mkdir ~/hellogreenfield
$ cd ~/hellogreenfield
$ go mod init hellogreenfield

SDK Bağımlılıklarını Ekle

$ go get github.com/bnb-chain/greenfield-go-sdk
ipucu

Bağımlılıkları değiştirmek için go.mod dosyasını düzenleyin.

replace (
cosmossdk.io/api => github.com/bnb-chain/greenfield-cosmos-sdk/api v0.0.0-20230425074444-eb5869b05fe9
cosmossdk.io/math => github.com/bnb-chain/greenfield-cosmos-sdk/math v0.0.0-20230425074444-eb5869b05fe9
github.com/cometbft/cometbft => github.com/bnb-chain/greenfield-cometbft v0.0.2
github.com/cometbft/cometbft-db => github.com/bnb-chain/greenfield-cometbft-db v0.8.1-alpha.1
github.com/cosmos/cosmos-sdk => github.com/bnb-chain/greenfield-cosmos-sdk v0.2.3
github.com/cosmos/iavl => github.com/bnb-chain/greenfield-iavl v0.20.1-alpha.1
github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
)

Bağımlılıkları Kur

go mod tidy

Basit bir fonksiyonu test et

Basit bir main.go oluşturmak için genel bakış referans alabilirsiniz.

Her şey doğru bir şekilde ayarlanmışsa, kodunuz Greenfield düğümüne bağlanabilecek ve yukarıda gösterilen zincir verilerini döndürebilecektir.


Hesap Kurulumu

İki hesap hazırlamanız gerekiyor; biri anahtar olur, bu bir yönetici gibi hareket eder ve diğeri ise nesneleri görüntülemek/güncellemek için erişim alacak bir üyedir.

    account, err := types.NewAccountFromPrivateKey("test", privateKey)
if err != nil {
log.Fatalf("Özel anahtardan yeni hesap oluşturma hatası, %v", err)
}
cli, err := client.New(chainId, rpcAddr, client.Option{DefaultAccount: account})
if err != nil {
log.Fatalf("Yeni greenfield istemcisi oluşturulamadı, %v", err)
}

Grup Oluşturma

Sonraki adım, anahtar hesabından erişim alacak bir grup oluşturmaktır.

  // grup oluştur
groupTx, err := cli.CreateGroup(ctx, groupName, types.CreateGroupOptions{})
handleErr(err, "CreateGroup")
_, err = cli.WaitForTx(ctx, groupTx)
if err != nil {
log.Fatalln("işlem başarısız")
}

log.Printf("grup %s başarıyla oluşturuldu \n", groupName)

// grup bilgilerini görüntüle
creator, err := cli.GetDefaultAccount()
handleErr(err, "GetDefaultAccount")
groupInfo, err := cli.HeadGroup(ctx, groupName, creator.GetAddress().String())
handleErr(err, "HeadGroup")
log.Println("grup bilgileri:", groupInfo.String())

_, err = sdk.AccAddressFromHexUnsafe(memberAddress)
if err != nil {
log.Fatalln("grup üyesi geçersiz")
}
// grup üyesi ekle
updateTx, err := cli.UpdateGroupMember(ctx, groupName, creator.GetAddress().String(), []string{memberAddress}, []string{},
types.UpdateGroupMemberOption{})
handleErr(err, "UpdateGroupMember")
_, err = cli.WaitForTx(ctx, updateTx)
if err != nil {
log.Fatalln("işlem başarısız")
}

log.Printf("grup üyesi: %s başarıyla gruba eklendi: %s \n", memberAddress, groupName)

// grup üyesini kontrol et
memIsExist := cli.HeadGroupMember(ctx, groupName, creator.GetAddress().String(), memberAddress)
if !memIsExist {
log.Fatalf("grup üyesi %s kontrolünde başarısız \n", memberAddress)
}

log.Printf(" grup üyesi %s mevcut \n", memberAddress)

Sonuç, aşağıdaki gibi bir şey olacak:

2023/10/31 09:34:54 grup oluşturma başarılı sample-group
2023/10/31 09:34:54 grup bilgileri: owner:"0x525482AB3922230e4D73079890dC905dCc3D37cd" group_name:"sample-group" id:"720"
2023/10/31 09:35:01 grup üyesi: 0x843e77D639b6C382e91ef489881963209cB238E5 gruba başarıyla eklendi: sample-group
2023/10/31 09:35:01 grup üyesi 0x843e77D639b6C382e91ef489881963209cB238E5 mevcut

Politika Oluşturma

Artık anahtar hesabının bu gruba kova sil, kova güncelle, nesne sil, nesne güncelle erişimi vermesine izin verebilirsiniz.

// kova politikası belirle
bucketActions := []permTypes.ActionType{
permTypes.ACTION_UPDATE_BUCKET_INFO,
permTypes.ACTION_DELETE_BUCKET,
permTypes.ACTION_DELETE_OBJECT,
permTypes.ACTION_GET_OBJECT,
}
ctx := context.Background()
statements := utils.NewStatement(bucketActions, permTypes.EFFECT_ALLOW, nil, types.NewStatementOptions{})

policyTx, err := cli.PutBucketPolicy(ctx, bucketName, principalStr, []*permTypes.Statement{&statements},
types.PutPolicyOption{})
handleErr(err, "PutBucketPolicy")
_, err = cli.WaitForTx(ctx, policyTx)
if err != nil {
log.Fatalln("işlem başarısız")
}
log.Printf("kova %s politikası başarıyla belirlendi, anahtar: %s.\n", bucketName, principal)

Kod çalıştırıldıktan sonra sonuç aşağıdaki gibi bir şey olacak:

2023/10/31 10:46:55 kova sdkexamplebucket politikası başarıyla belirlendi, anahtar:
2023/10/31 10:46:55 kova: sdkexamplebucket politika bilgisi:id:"2358" principal:<type:PRINCIPAL_TYPE_GNFD_ACCOUNT value:"0x843e77D639b6C382e91ef489881963209cB238E5" > resource_type:RESOURCE_TYPE_BUCKET resource_id:"429" statements:<effect:EFFECT_ALLOW actions:ACTION_UPDATE_BUCKET_INFO actions:ACTION_DELETE_BUCKET actions:ACTION_DELETE_OBJECT actions:ACTION_GET_OBJECT >

Ayrıca blok tarayıcıyı kullanarak da inceleyebilirsiniz, örneğin https://greenfieldscan.com.

Politika Doğrulama

İşte politika meta verilerini zincir üzerinde doğrulamak için bir örnek:

// kova politikası al
policyInfo, err := cli.GetBucketPolicy(ctx, bucketName, memberAddress)
handleErr(err, "GetBucketPolicy")
log.Printf("kova: %s politika bilgisi:%s\n", bucketName, policyInfo.String())

// izinleri doğrula
effect, err := cli.IsBucketPermissionAllowed(ctx, memberAddress, bucketName, permTypes.ACTION_DELETE_BUCKET)
handleErr(err, "IsBucketPermissionAllowed")

if effect != permTypes.EFFECT_ALLOW {
log.Fatalln("izin verilmedi: ", principalStr)
}

Politika beklendiği gibi kaydedildiyse, herhangi bir hata görmeyeceksiniz.

Politika Silme

İşte kova politikanızı silmek için bir örnek.

principalStr, NewPrincipalWithAccount veya NewPrincipalWithGroupId yöntemiyle oluşturulabilir.

    // kova politikasını sil
policyTx, err = cli.DeleteBucketPolicy(ctx, bucketName, principalStr, types.DeletePolicyOption{})
handleErr(err, "DeleteBucketPolicy")
_, err = cli.WaitForTx(ctx, policyTx)
if err != nil {
log.Fatalln("işlem başarısız")
}

Kaynak Kodu