Twisted Authentication с перспективным брокером - PullRequest
0 голосов
/ 19 июля 2011

Занимался твистедской неделей, читал книгу и большинство доков, но не могу понять ни одного момента.Из Twisted docs http://twistedmatrix.com/documents/10.1.0/core/howto/pb-cred.html сервер

#!/usr/bin/env python

# Copyright (c) 2009 Twisted Matrix Laboratories.
# See LICENSE for details.

from zope.interface import implements

from twisted.spread import pb
from twisted.cred import checkers, portal
from twisted.internet import reactor

class MyPerspective(pb.Avatar):
    def __init__(self, name):
        self.name = name
    def perspective_foo(self, arg):
        print "I am", self.name, "perspective_foo(",arg,") called on", self

class MyRealm:
    implements(portal.IRealm)
    def requestAvatar(self, avatarId, mind, *interfaces):
        if pb.IPerspective not in interfaces:
            raise NotImplementedError
        return pb.IPerspective, MyPerspective(avatarId), lambda:None

p = portal.Portal(MyRealm())
c = checkers.InMemoryUsernamePasswordDatabaseDontUse(user1="pass1",
                                                     user2="pass2")
p.registerChecker(c)
reactor.listenTCP(8800, pb.PBServerFactory(p))
reactor.run()

клиент

#!/usr/bin/env python

# Copyright (c) 2009 Twisted Matrix Laboratories.
# See LICENSE for details.

from twisted.spread import pb
from twisted.internet import reactor
from twisted.cred import credentials

def main():
    factory = pb.PBClientFactory()
    reactor.connectTCP("localhost", 8800, factory)
    def1 = factory.login(credentials.UsernamePassword("user1", "pass1"))
    def1.addCallback(connected)
    reactor.run()

def connected(perspective):
    print "got perspective1 ref:", perspective
    print "asking it to foo(13)"
    perspective.callRemote("foo", 13)

main()

, если пользователь вводит неправильный пароль:

Unhandled Error
Traceback (most recent call last):
Failure: twisted.cred.error.UnauthorizedLogin: 

I вместоисключение, скажите пользователю, что он не вводит правильный пароль? \ bad username

Я пытался изменить:

c = checkers.InMemoryUsernamePasswordDatabaseDontUse(user1="pass1",user2="pass2") 
p.registerChecker(c)

на

passwords = {
    'admin': 'aaa',
    'user1': 'bbb',
    'user2': 'ccc'
    }
p.registerChecker(PasswordDictChecker(passwords))
class PasswordDictChecker(object):
    implements(checkers.ICredentialsChecker)
    credentialInterfaces = (credentials.IUsernamePassword,)

    def __init__(self, passwords):
        "passwords: a dict-like object mapping usernames to passwords"
        self.passwords = passwords

    def requestAvatarId(self, credentials):
        username = credentials.username
        if self.passwords.has_key(username):
            if credentials.password == self.passwords[username]:
                return defer.succeed(username)
            else:
                return defer.fail(
                    credError.UnauthorizedLogin("Bad password"))
        else:
            return defer.fail(
                credError.UnauthorizedLogin("No such user"))

, но получилошибка, и я думаю, что это неправильный путь.

PS Я знаю, как сделать аутентификацию без посредника перспективы ...

1 Ответ

0 голосов
/ 20 июля 2011

Если вы хотите реализовать повтор, сделайте это полностью на клиенте. Вам следует , а не изменить сервер, чтобы он сообщал о таких сообщениях, как «Неверный пароль» или «Нет такого пользователя», так как они передают информацию злоумышленнику.

Чтобы клиент повторил попытку, добавьте в лог отложенного входа ошибку, которая запрашивает новый пароль (и, возможно, нового пользователя) и снова вызывает логин.

...