Servidor Couchbase 5.0 oferece ótimos novos recursos de autenticação que exigem algumas pequenas alterações no código de conexão do cliente. As alterações específicas no SDK estão descritas nesta postagem e também se referem às alterações feitas na versão de pré-lançamento Compilação do desenvolvedor de abril bem como as próximas versões Beta.
Consulte a Introdução ao controle de acesso baseado em função, de Matthew: Parte 1 & Parte 2
Em resumo, as senhas baseadas em baldes (e baldes sem senha) são agora coisa do passado. Em vez disso, fornecemos controle de acesso em nível de função refinado a buckets, dados e todos os serviços. Agora é possível criar um usuário com funções e direitos de acesso específicos e, em seguida, conectar-se como esse usuário (com senha) em seu cliente.
Há três padrões específicos para usar esses novos recursos, e analiso cada opção nesta postagem.
Como isso se baseia no código do servidor de pré-produção, os exemplos podem mudar. Observe também que você precisa ter o bibliotecas mais recentes do SDK para seu idioma, suportados no momento da redação deste documento são Java, .NET, Node.js, PHP, Python, Go e C.
Compartimentos nomeados pelo usuário
Se você continuar a usar a string de conexão URI básica para um bucket sem um nome de usuário, há algumas suposições que o cliente faz agora.
Primeiro, ele presumirá que você tem um usuário com o mesmo nome do seu bucket. Os usuários que migram de versões anteriores ficarão satisfeitos com isso, pois tudo o que precisam fazer é fornecer uma senha com a string de conexão, conforme mostrado neste exemplo do Python:
1 |
>>> db = Balde("couchbase://localhost/tyler",senha="tyler123") |
(Esse uso simplificado é limitado às bibliotecas Python, PHP e C)
O exposto acima pressupõe não apenas a existência de um balde nomeado tyler mas também um usuário nomeado tyler que tenha uma função de acesso ao bucket ativada.
Baldes sem senha não são mais permitidos, mas com uma exceção: os buckets migrados. É impossível criar um novo usuário sem uma senha, mas o processo de migração criará usuários, sem senhas, para buckets que anteriormente não tinham uma.
Como acima, o usuário terá o mesmo nome que o bucket e nenhuma senha. Nesse caso, você pode passar uma string de senha vazia com a string de conexão.
Após a migração, todos os novos buckets e usuários precisarão de senhas, portanto, esse é um bom momento para mudar sua abordagem daqui para frente.
Como passar nome de usuário e senha com o nome do bucket
O novo paradigma de autenticação daqui para frente tem duas maneiras de gerenciar conexões autenticadas. A abordagem mais simples é ajustar os parâmetros de conexão para incluir o nome de usuário e a senha, o que pode ser feito facilmente em Python, :
1 |
>>> db = Balde("couchbase://localhost/travel-sample", nome de usuário="tyler", senha="tyler123") |
No entanto, essa é uma abordagem muito simplista. Há uma opção mais eficiente que usa o nova classe Authenticator para gerenciar a autenticação em, potencialmente, vários buckets.
Classe Authenticator para lidar com usuários e buckets
A maneira "adequada" de lidar com a autenticação é desacoplá-la completamente do URI do Bucket e passá-la para a conexão do Cluster quando necessário.
Aqui, a inicialização do Authenticator pega um determinado Cluster e faz a autenticação nele. Nesses exemplos, você vê que o padrão em todos os idiomas é o mesmo. O Authenticator pode então ser passado para outros Clusters, conforme desejado.
Python
1 2 3 4 5 6 7 8 |
de couchbase.agrupamento importação Aglomerado de couchbase.agrupamento importação PasswordAuthenticator agrupamento = Aglomerado('couchbase://localhost') autenticador = PasswordAuthenticator('nome de usuário', 'senha') agrupamento.autenticar(autenticador) balde = agrupamento.open_bucket('bucket-name' (nome do balde)) |
Java
1 2 3 |
Aglomerado agrupamento = CouchbaseCluster.criar(); agrupamento.autenticar("nome de usuário", "senha"); Balde balde = agrupamento.openBucket("bucket-name" (nome do balde)); |
.NET
1 2 3 4 5 |
var agrupamento = novo Aglomerado(novo Configuração de cliente { Servidores = novo Lista<Uri> { novo Uri("http://localhost") }}); var autenticador = novo PasswordAuthenticator("nome de usuário", "senha"); agrupamento.Autenticar(autenticador); var balde = agrupamento.OpenBucket("bucket-name" (nome do balde)); |
PHP
1 2 3 4 5 |
$authenticator = novo \Couchbase\PasswordAuthenticator(); $authenticator->nome de usuário('nome de usuário')->senha('senha'); $cluster = novo \Couchbase\Aglomerado('couchbase://localhost'); $cluster->autenticar($authenticator); |
Node.js
1 2 3 4 |
var couchbase = exigir('couchbase'); var agrupamento = novo couchbase.Aglomerado('couchbase://localhost/'); agrupamento.autenticar('nome de usuário', 'senha'); var balde = agrupamento.openBucket('bucket-name' (nome do balde)); |
Próximas etapas
Observe que a principal mudança de design em seus aplicativos é não usar uma senha específica para o bucket. Em vez disso, você precisa ter um usuário com uma função adequada que tenha acesso a determinados buckets.
Com apenas algumas linhas de alteração de código, você aproveita facilmente os recursos de controle de acesso baseado em função do Couchbase Server 5.0.
Faça o upgrade para o última versão de desenvolvedor e atualize suas bibliotecas de clientes para começar a experimentá-lo.
Junte-se a nós em os fóruns em caso de dúvidas!
[…] https://www.couchbase.com/new-sdk-authentication/ […]
Preciso estabelecer uma conexão SSL. Como eu poderia especificar o certpath no novo SDK? Especificamente, estou usando python. No passado, eu fazia algo parecido com isto:
db = Bucket("couchbase://localhost/tyler?certpath=/etc/ca-bundle.crt",password="tyler123″)
Olá, obrigado por ler! Da mesma forma que de costume, apenas certifique-se de ter o "s" no final de "couchbases://"... Avise-me se tiver problemas novamente.
Oi Tyler,
Eu deveria ter esclarecido que minha pergunta era especificamente como e onde especificar o arquivo de caminho do certificado? Usamos certificados autoassinados e, sem especificar isso, recebo a mensagem "RC=0x37[O cliente não pôde verificar o certificado do servidor]"
No passado, o certpath era passado como um parâmetro do tipo url na string de conexão. Não tenho certeza de como especificar isso no novo sdk.