2015-12-14 4 views
0

Я пытаюсь использовать базовую аутентификацию 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, соответственно?

ответ

0

Кто-то задал этот же вопрос о рассеченной списке рассылки, с очень похожими образцами кода - 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, который делает определение, если пользователь, которого они представляют (действительно, по крайней мере, идентификатор должен быть отправлен в GuardedResource. init) имеет доступ к другим ресурсам и возвращает их, если поэтому, и соответствующие ошибки, если нет.

Даже ресурсы, доступные незарегистрированному пользователю (см. Twisted.cred.credentials.Anonymous), - это еще один аватар, который служил не прошедшим проверку подлинности людям.

Так что, если у вас есть https://myapp.example.com/a/b/secure/c/dhttps://myapp.example.com/a/b/secure/c/d, https://myapp.example.com/a/b/securehttps://myapp.example.com/a/b/secure будет охраняемом ресурс, а затем SecureResource.getChild («с», ...) возвращает «C», что в свою очередь возврата «д», если пользователь имеет доступ к нему.

Надеюсь, этот ответ сработал для вас в списке :-).

Смежные вопросы