2015-12-14 30 views
0

我试图使用Twisted的HTTP基本身份验证来控制对某些受保护资源的访问。twisted.cred.portal.IRealm,门户和头像之间的关系是什么

据一些文章,有必要使用三个重要概念:领域,门户网站和头像。现在我想知道Realm和头像是否是一一对应的。

让我们来看一个例子

import sys 

from zope.interface import implements 

from twisted.python import log 
from twisted.internet import reactor 
from twisted.web import server, resource, guard 
from twisted.cred.portal import IRealm, Portal 
from twisted.cred.checkers import InMemoryUsernamePasswordDatabaseDontUse 


class GuardedResource(resource.Resource): 
    """ 
    A resource which is protected by guard 
    and requires authentication in order 
    to access. 
    """ 
    def getChild(self, path, request): 
     return self 


    def render(self, request): 
     return "Authorized!" 



class SimpleRealm(object): 
    """ 
    A realm which gives out L{GuardedResource} instances for authenticated 
    users. 
    """ 
    implements(IRealm) 

    def requestAvatar(self, avatarId, mind, *interfaces): 
     if resource.IResource in interfaces: 
      return resource.IResource, GuardedResource(), lambda: None 
     raise NotImplementedError() 



def main(): 
    log.startLogging(sys.stdout) 
    checkers = [InMemoryUsernamePasswordDatabaseDontUse(joe='blow')] 
    wrapper = guard.HTTPAuthSessionWrapper(
     Portal(SimpleRealm(), checkers), 
     [guard.DigestCredentialFactory('md5', 'example.com')]) 
    reactor.listenTCP(8889, server.Site(
      resource = wrapper)) 
    reactor.run() 

if __name__ == '__main__': 
    main() 

我当然知道SimpleRealm用于返回相应的资源,例如以上例子中的GuardedResource。但是,当有大量资源需要守护时,我不知道该怎么办。例如,我有GuardedResource1,GuardedResource2和GuardedResource3,可能它们在初始化时需要相同或不同数量的参数;如果是这样,是否有必要分别实现SimpleRealm1,SimpleRealm2和SimpleRealm3?

回答

0

有人问扭曲的邮件列表上同样的问题,具有非常相似的代码示例 - http://twistedmatrix.com/pipermail/twisted-python/2015-December/030042.html - 所以我将把你我的回答有:http://twistedmatrix.com/pipermail/twisted-python/2015-December/030068.html

,而不是资源的思想一如既往现有只需要锁定或不锁定,考虑一个单一的Avatar对象(在这种情况下:从SimpleRealm返回的顶级IResource)的最灵活的模型(Cred实际实现的模型)是“用户有权访问“。换句话说,“GuardedResource”应该有一个“getChild”方法,该方法使判定如果它们表示用户(实际上,至少avatarId应供给至GuardedResource。INIT)具有访问其他资源,并且如果返回它们所以,如果不是,则适当的错误。

即使是提供给一个不登录的用户资源(见twisted.cred.credentials.Anonymous)只是另一种化身,一个担任了未经认证的人。

所以,如果你有https://myapp.example.com/a/b/secure/c/dhttps://myapp.example.com/a/b/secure/c/dhttps://myapp.example.com/a/b/securehttps://myapp.example.com/a/b/secure将是谨慎的资源,然后SecureResource.getChild(“C”,...)将返回“C”,而后者将在重返“d”,如果登录用户可以访问它。

希望这个答案在你的名单上工作:-)。

相关问题