Herkese merhaba!

Uzun yıllardır bol miktarda kişisel zaman ve enerji harcayarak bilgimizi hepinizle paylaşıyoruz. Ancak şu andan itibaren bu blogu çalışır durumda tutabilmek için yardımınıza ihtiyacımız var. Yapmanız gereken tek şey, sitedeki reklamlardan birine tıklamak olacaktır, aksi takdirde hosting vb. masraflar nedeniyle maalesef yayından kaldırılacaktır. Teşekkürler.

Varsayılan olarak, Cassandra yüklemesi kimlik doğrulamasını devre dışı bırakır. Uygulamanız Cassandra'ya bağlanabilir, böylece uygulamanızdaki cluster.Authenticator yapılandırma seçeneğini kullanmanın hiçbir etkisi olmaz. Üstelik, aşağıda gösterildiği gibi herhangi bir kimlik bilgisi olmadan cqlsh komutunu kullanabilirsiniz. Bunun nedeni, kimlik doğrulama için Cassandra yapılandırmasının authenticator: AllowAllAuthenticator olarak ayarlanmasıdır.


/# cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.11.9 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.

Kimlik doğrulamasını etkinleştirmek isterseniz, kimlik doğrulaması için Cassandra yapılandırmasını authenticator: PasswordAuthenticator olarak ayarlayabilirsiniz. Cassandra varsayılan kimlik bilgilerini "cassandra" (kullanıcı adı) ve "cassandra" (şifre) olarak ayarlar. Bunu teyit edelim.


/# cqlsh -u cassandra -p cassandra
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.11.9 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.

cqlsh$ LIST USERS;

name | super
-----------+-------
cassandra | True

cqlsh$ LIST ALL OF cassandra;

role | username | resource | permission
-----------+-----------+--------------+------------
cassandra | cassandra | role inanzzz | ALTER
cassandra | cassandra | role inanzzz | DROP
cassandra | cassandra | role inanzzz | AUTHORIZE

Aşağıdaki komutla yeni bir kullanıcı oluşturabilirsiniz. Bu kullanıcıyı "süper" yapmak istiyorsanız, sorgunun sonuna SUPERUSER anahtarını ekleyin.


cqlsh$ CREATE USER 'inanzzz' WITH PASSWORD '123123';

cqlsh$ LIST USERS;

name | super
-----------+-------
cassandra | True
inanzzz | False

cqlsh$ LIST ALL OF inanzzz;

role | resource | permissions
------+----------+-------------

Kullanıcılara ekstra izin verebilirsiniz. Yetkilendirme için Cassandra yapılandırmasını authorizer: CassandraAuthorizer olarak ayarlamanız gerekir. İlki inanzzz isimli kullanıcıya yalnızca blog tablosu için "read only", ikincisi için "full" erişim sağlar.


cqlsh$ GRANT SELECT ON KEYSPACE blog TO inanzzz;

cqlsh$ LIST ALL OF inanzzz;

role | username | resource | permission
---------+----------+---------------+------------
inanzzz | inanzzz | keyspace blog | SELECT

cqlsh$ GRANT ALL ON KEYSPACE blog TO inanzzz;

cqlsh$ LIST ALL OF inanzzz;

role | username | resource | permission
---------+----------+---------------+------------
inanzzz | inanzzz | keyspace blog | CREATE
inanzzz | inanzzz | keyspace blog | ALTER
inanzzz | inanzzz | keyspace blog | DROP
inanzzz | inanzzz | keyspace blog | SELECT
inanzzz | inanzzz | keyspace blog | MODIFY
inanzzz | inanzzz | keyspace blog | AUTHORIZE

Uygulama örneği


├── docker
│   ├── cassandra.yaml
│   └── docker-compose.yaml
├── internal
│   └── cassandra
│   └── cassandra.go
└── main.go

Dosyalar


cassandra.go


package cassandra

import (
"time"

"github.com/gocql/gocql"
)

type Config struct {
Hosts []string
Port int
Username string
Password string
ProtoVersion int
Consistency string
Keyspace string
Timeout time.Duration
}

func New(config Config) (*gocql.Session, error) {
cluster := gocql.NewCluster(config.Hosts...)

cluster.Port = config.Port
cluster.ProtoVersion = config.ProtoVersion
cluster.Keyspace = config.Keyspace
cluster.Consistency = gocql.ParseConsistency(config.Consistency)
cluster.Timeout = config.Timeout
cluster.Authenticator = gocql.PasswordAuthenticator{
Username: config.Username,
Password: config.Password,
}

return cluster.CreateSession()
}

main.go


package main

import (
"fmt"
"log"
"time"

"github.com/you/blog/internal/cassandra"
)

func main() {
cas, err := cassandra.New(cassandra.Config{
Hosts: []string{"127.0.0.1"},
Port: 9042,
Username: "inanzzz",
Password: "123123",
ProtoVersion: 4,
Consistency: "Quorum",
Keyspace: "blog",
Timeout: time.Second * 5,
})
if err != nil {
log.Fatalln(err)
}
defer cas.Close()

fmt.Printf("%+v\n", cas)
}

docker-compose.yaml


version: "3.7"

services:

blog-cassandra:
image: "cassandra:3.11.9"
container_name: "blog-cassandra"
ports:
- "9042:9042"
environment:
- "MAX_HEAP_SIZE=256M"
- "HEAP_NEWSIZE=128M"
volumes:
- "./cassandra.yaml:/etc/cassandra/cassandra.yaml"

cassandra.yaml


Yalnızca aşağıdaki seçenekler değiştirildi. Gerisi bozulmadan bırakılır.


...
...
authenticator: PasswordAuthenticator
authorizer: CassandraAuthorizer
...
...