Skip to content

Commit

Permalink
add get_current_user helper method
Browse files Browse the repository at this point in the history
- returns flask_login user first, if any, and falls back on request loaders
fixes #50
  • Loading branch information
guruofgentoo committed Jun 7, 2019
1 parent aa1bc21 commit cae02a2
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 2 deletions.
1 change: 1 addition & 0 deletions keg_auth/__init__.py
@@ -1,5 +1,6 @@
# flake8: noqa
from keg_auth.core import AuthManager
from keg_auth.libs import get_current_user
from keg_auth.libs.authenticators import (
JwtRequestLoader,
KegAuthenticator,
Expand Down
18 changes: 18 additions & 0 deletions keg_auth/libs/__init__.py
@@ -0,0 +1,18 @@
import flask
import flask_login


def get_current_user():
# if flask_login has an authenticated user in session, that's who we want
if flask_login.current_user and flask_login.current_user.is_authenticated:
return flask_login.current_user

# no user in session right now, so we need to run request loaders to see if any match
user = None
for loader in flask.current_app.auth_manager.request_loaders.values():
user = loader.get_authenticated_user()
if user:
break
if not user or not user.is_authenticated:
return None
return user
30 changes: 28 additions & 2 deletions keg_auth/tests/test_views.py
Expand Up @@ -8,13 +8,16 @@
import mock
import pytest
import sqlalchemy as sa
from werkzeug.datastructures import MultiDict
from keg_auth_ta.app import mail_ext
from keg_auth.testing import AuthTests, AuthTestApp, ViewTestBase

from keg_auth_ta.model import entities as ents
from flask_login import user_logged_in
import flask_login
from .utils import listen_to

from keg_auth import get_current_user


class TestAuthIntegration(AuthTests):
user_ent = ents.User
Expand Down Expand Up @@ -128,7 +131,7 @@ def test_login_user_sets_last_login_and_invalidates_token(self):

resp.form['login_id'] = 'foo@bar.com'
resp.form['password'] = 'pass'
with listen_to(user_logged_in) as listener:
with listen_to(flask_login.user_logged_in) as listener:
resp = resp.form.submit()
listener.assert_heard_one(flask.current_app, user=u)

Expand Down Expand Up @@ -1056,3 +1059,26 @@ def test_list_export(self):
ents.Permission.testing_create()
resp = self.client.get('/permissions?export_to=xlsx')
assert resp.content_type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' # noqa


class TestGetCurrentUser:
def test_no_user_returned(self):
with flask.current_app.test_request_context():
assert get_current_user() is None

def test_flask_login_user_returned(self):
with flask.current_app.test_request_context():
user = ents.User.testing_create()
flask_login.login_user(user)
assert get_current_user().id == user.id

def test_request_loader_user_returned(self):
with flask.current_app.test_request_context():
user = ents.User.testing_create()
jwt_auth = flask.current_app.auth_manager.get_request_loader('jwt')
token = jwt_auth.create_access_token(user)
flask.request.headers = MultiDict([
('Authorization', 'Bearer {}'.format(token)),
])

assert get_current_user().id == user.id

0 comments on commit cae02a2

Please sign in to comment.