twisted.cred.portal.IRealm,Portal和avatar

时间:2015-12-14 01:38:29

标签: http twisted basic-authentication

我尝试使用Twisted的HTTP基本身份验证来控制对某些受保护资源的访问。

根据一些文章,有必要使用三个重要概念:Realm,Portal和avatar。现在我想知道王国和化身是否是一对一的对应关系。

让我们看一个例子

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?

1 个答案:

答案 0 :(得分:0)

有人在Twisted邮件列表上问了同样的问题,代码示例非常相似 - http://twistedmatrix.com/pipermail/twisted-python/2015-December/030042.html - 所以我会在那里引用你的答案:http://twistedmatrix.com/pipermail/twisted-python/2015-December/030068.html

  

不是将资源视为始终存在而只是需要对其进行锁定,而是考虑更灵活的模型(信任实际实现的模型)单个Avatar对象(在这种情况下:顶部IResource)从SimpleRealm返回)是"用户有权访问的所有内容的最高级别"。换句话说,' GuardedResource'应该有一个'getChild'确定他们所代表的用户(实际上,至少avatarId是否应该提供给GuardedResource。 init )的方法可以访问其他资源,如果是,则返回它们,如果没有,则返回适当的错误。

     

即使是未登录用户可用的资源(参见twisted.cred.credentials.Anonymous)也只是另一个虚拟形象,一个服务于未经身份验证的人。

     

因此,如果您有https://myapp.example.com/a/b/secure/c/d https://myapp.example.com/a/b/secure/c/dhttps://myapp.example.com/a/b/secure https://myapp.example.com/a/b/secure将成为受保护的资源,然后是SecureResource.getChild(" c", ...)将返回" c",这将返回" d"如果登录用户有权访问它。

希望这个答案对你有用: - )。