2011-07-19 4 views
0

Tvisted週を勉強していて、書籍とほとんどのドックを読んでいますが、一瞬しか理解できません。ツイストドキュメントから http://twistedmatrix.com/documents/10.1.0/core/howto/pb-cred.html サーバーPerspective Brokerを使用したひねり認証

#!/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")) 

ではなく、エラーを持って、私は、これは間違った方法だと思います。

P.S.私はPerspective Brokerなしで認証を行う方法を知っています...

答えて

0

再試行を実装する場合は、クライアントで完全に行います。 ではないこれらの情報が攻撃者に漏洩するため、サーバーは「悪いパスワード」や「そのようなユーザーはいない」などのメッセージを報告するように変更してください。

クライアントを再試行するには、ログインにDeferredを追加します。新しいパスワード(および新しいユーザーかもしれません)を要求し、再度loginを呼び出します。

+0

ああ、それはかなり簡単な解決策です。 – Echeg

関連する問題