Я пытаюсь использовать базовую аутентификацию HTTP Twisted для контроля доступа к некоторым защищенным ресурсам.Каковы отношения между twisted.cred.portal.IRealm, Portal и аватаром
Согласно некоторым статьям, необходимо использовать три важных понятия: царство, портал и аватар. Теперь мне интересно, соответствует ли Царство и аватар одной-единственной переписке.
Давайте посмотрим на пример
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, соответственно?