13 __docformat__ = 'restructuredtext' |
13 __docformat__ = 'restructuredtext' |
14 |
14 |
15 import logging |
15 import logging |
16 from functools import lru_cache |
16 from functools import lru_cache |
17 |
17 |
|
18 from ZODB.POSException import ConnectionStateError |
18 from beaker.cache import cache_region |
19 from beaker.cache import cache_region |
19 from pyramid.authentication import AuthTktCookieHelper |
20 from pyramid.authentication import AuthTktCookieHelper |
20 from pyramid.decorator import reify |
21 from pyramid.decorator import reify |
21 from pyramid.interfaces import IAuthenticationPolicy |
22 from pyramid.interfaces import IAuthenticationPolicy |
22 from pyramid.location import lineage |
23 from pyramid.location import lineage |
23 from pyramid.security import Authenticated, Everyone |
24 from pyramid.security import Authenticated, Everyone |
24 from zope.container.folder import Folder |
25 from zope.container.folder import Folder |
25 from zope.interface import implementer |
26 from zope.interface import implementer |
26 from zope.schema.fieldproperty import FieldProperty |
27 from zope.schema.fieldproperty import FieldProperty |
27 |
28 |
28 from pyams_security.interfaces import AuthenticatedPrincipalEvent, IAuthenticationPlugin, ICredentialsPlugin, \ |
29 from pyams_security.interfaces import AuthenticatedPrincipalEvent, IAuthenticationPlugin, \ |
29 IDirectoryPlugin, IGroupsAwareDirectoryPlugin, IProtectedObject, ISecurityManager |
30 ICredentialsPlugin, IDirectoryPlugin, IGroupsAwareDirectoryPlugin, IProtectedObject, \ |
|
31 ISecurityManager |
30 from pyams_security.principal import MissingPrincipal, UnknownPrincipal |
32 from pyams_security.principal import MissingPrincipal, UnknownPrincipal |
31 from pyams_utils.registry import query_utility |
33 from pyams_utils.registry import query_utility |
32 from pyams_utils.request import check_request, request_property |
34 from pyams_utils.request import check_request, request_property |
33 from pyams_utils.wsgi import wsgi_environ_cache |
35 from pyams_utils.wsgi import wsgi_environ_cache |
34 |
36 |
263 principal_id = self.unauthenticated_userid(request) |
265 principal_id = self.unauthenticated_userid(request) |
264 if principal_id: |
266 if principal_id: |
265 return principal_id |
267 return principal_id |
266 manager = self._get_security_manager(request) |
268 manager = self._get_security_manager(request) |
267 if manager is not None: |
269 if manager is not None: |
268 return manager.authenticated_userid(request) |
270 try: |
|
271 return manager.authenticated_userid(request) |
|
272 except ConnectionStateError: |
|
273 pass |
|
274 return None |
269 |
275 |
270 @request_property(key=None) |
276 @request_property(key=None) |
271 def effective_principals(self, request, context=None): |
277 def effective_principals(self, request, context=None): |
272 try: |
278 try: |
273 logger.debug(">>> getting principals for principal {0} ({1}) on {2!r}".format(request.principal.title, |
279 logger.debug(">>> getting principals for principal {0} ({1}) on {2!r}".format(request.principal.title, |