
5 changed files with 101 additions and 8 deletions
@ -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