16/02/2021 - CASSANDRA, GO
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
├── docker
│ ├── cassandra.yaml
│ └── docker-compose.yaml
├── internal
│ └── cassandra
│ └── cassandra.go
└── main.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()
}
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)
}
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"
Yalnızca aşağıdaki seçenekler değiştirildi. Gerisi bozulmadan bırakılır.
...
...
authenticator: PasswordAuthenticator
authorizer: CassandraAuthorizer
...
...