
5 changed files with 101 additions and 8 deletions
@ -0,0 +1,54 @@
@@ -0,0 +1,54 @@
|
||||
""" User Authentication and Authorization """ |
||||
|
||||
from pyramid.security import Everyone, Authenticated |
||||
from sqlalchemy.orm.exc import NoResultFound |
||||
from pyramid.authorization import ACLAuthorizationPolicy |
||||
from pyramid.authentication import AuthTktAuthenticationPolicy |
||||
|
||||
|
||||
class AuthenticationPolicy(AuthTktAuthenticationPolicy): |
||||
""" How to authenticate users """ |
||||
|
||||
def authenticated_userid(self, request): |
||||
""" returns the id of an authenticated user |
||||
|
||||
heavy lifting done in get_user() attached to request |
||||
""" |
||||
user = request.user |
||||
if user is not None: |
||||
return user.id |
||||
|
||||
def effective_principals(self, request): |
||||
""" returns a list of principals for the user """ |
||||
principals = [Everyone] |
||||
user = request.user |
||||
if user is not None: |
||||
principals.append(Authenticated) |
||||
principals.extend(user.principals) |
||||
return principals |
||||
|
||||
|
||||
def get_user(request): |
||||
""" retrieves the user object by the unauthenticated user id """ |
||||
user_id = request.unauthenticated_userid |
||||
if user_id is None: |
||||
return None |
||||
try: |
||||
user = request.repo.get_user(user_id) |
||||
return user if user.is_active else None |
||||
except NoResultFound: |
||||
return None |
||||
|
||||
|
||||
def includeme(config): |
||||
""" initializing authentication and authorization for the Pyramid app |
||||
|
||||
Activate this setup using ``config.include('ordr2.security')``. |
||||
""" |
||||
settings = config.get_settings() |
||||
authn_policy = AuthenticationPolicy( |
||||
settings["auth.secret"], hashalg="sha512", |
||||
) |
||||
config.set_authentication_policy(authn_policy) |
||||
config.set_authorization_policy(ACLAuthorizationPolicy()) |
||||
config.add_request_method(get_user, "user", reify=True) |
Loading…
Reference in new issue