如何将用户名和密码传递给python中的cassandra

时间:2014-02-14 19:30:24

标签: python authentication cassandra

我正在学习并设置我的cassandra集群并尝试使用python作为客户端与之交互。在yaml中,我将authenticator设置为PasswordAuthenticator。

所以现在我计划将我的用户名和密码提供给connect函数,但是找不到放置它们的位置。

cluster = Cluster(hosts)
session = cluster.connect(keyspace)

基本上,您只提供主机和密钥空间。文档类型建议与匿名连接? http://datastax.github.io/python-driver/getting_started.html#connecting-to-cassandra

如果我只使用该示例,我将收到以下错误

raise NoHostAvailable("Unable to connect to any servers", errors)
cassandra.cluster.NoHostAvailable: ('Unable to connect to any servers', {'hou722067': AuthenticationFailed('Remote end requires authentication.',)})

是否通过某些配置文件提供了身份验证信息?它似乎是一个非常基本的功能,我无法想象它不在python客户端驱动程序中。我一定错过了什么。

简而言之,我的问题是:如何使用python登录cassandra?

提前感谢任何暗示!

=============================================== == 知道了。

我应该在auth_provider字段中提供用户名和密码,该字段是一个函数,返回包含'username'和'password'键以及相应字符串值的字典。

喜欢的东西 def getCredential(self,host):                 credential = {'username':'myUser','password':'myPassword'}                 返回凭证

cluster = Cluster(nodes,auth_provider = getCredential)

5 个答案:

答案 0 :(得分:14)

按照操作建议使用:

from cassandra.cluster import Cluster

def getCredential(self):
    return {'username': 'foo', 'password': 'bar'} 

node_ips = ['0.0.0.0', '0.0.0.1']

cluster = Cluster(node_ips, protocol_version=1, auth_provider=getCredential)
session = cluster.connect()

如果您使用的是协议版本2,则必须使用AuthProvider对象进行身份验证。 EX:

from cassandra.auth import PlainTextAuthProvider
from cassandra.cluster import Cluster

ap = PlainTextAuthProvider(username=foo, password=bar)
c = Cluster(protocol_version=2, auth_provider=ap)
s = c.connect()

有人可以使用这些方法之一来解释使用远程群集进行身份验证的最佳做法吗?

答案 1 :(得分:3)

如果您使用的是协议版本4,则必须使用 AuthProvider 对象进行身份验证,并定义以前的auth_provider

from cassandra.auth import PlainTextAuthProvider
from cassandra.cqlengine import connection

    auth_provider = PlainTextAuthProvider(username='user_name', password='user_pwd')

    connection.setup(cassandra_host, default_keyspace, retry_connect=True, protocol_version=4, auth_provider=auth_provider)

答案 2 :(得分:2)

你去.. 下面是与python中的cassandra连接的代码。

from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
auth_provider = PlainTextAuthProvider(username='username', password='password')
cluster = Cluster(["hostname"],auth_provider = auth_provider)
session = cluster.connect()
session.set_keyspace('keyspace')
cluster.connect()

答案 3 :(得分:0)

令人惊讶的是,没有人提出至少比硬编码身份验证凭证更安全的建议。考虑到您使用git或任何其他VCS,这种初始化方式可能会导致非常严重的安全问题。我建议将您的用户名,密码,IP,端口和其他私人信息存储在一些配置文件中,该文件不会存储在VCS中,因此,如果有人访问该代码,数据仍然是安全的。

config.yaml:

cassandra:
    username: username
    password: password
    hosts: [10.42.42.42, 10.10.42.42]

code.py:

import yaml
import cassandra.cluster
import cassandra.auth

from cassandra.policies import DCAwareRoundRobinPolicy


class Cassandra:
    def __init__(self, config):
        config = config['cassandra']
        auth_provider = cassandra.auth.PlainTextAuthProvider(
            username=config['username'],
            password=config['password'])

        self.__cluster = cassandra.cluster.Cluster(
            contact_points=config['hosts'],
            load_balancing_policy=DCAwareRoundRobinPolicy(),
            auth_provider=auth_provider)

        self.__session = self.__cluster.connect()

def query():
    result = self.__session.execute("SELECT * FROM table")
    return result._current_rows

with open('config.yaml', 'r') as f:
    config = yaml.load(f)

cassandra = Cassandra(config)
data = cassandra.query()

答案 4 :(得分:0)

现在您可以执行以下操作:

from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider

auth_provider = PlainTextAuthProvider(
        username='cassandra', password='cassandra')
cluster = Cluster(['non-local-address'], port=9042, auth_provider = auth_provider)

session = cluster.connect('yourkeyspace')
session.execute('USE yourkeyspace')
session.execute("SELECT * FROM yourkeyspace.yourtable").one()