From dbf540d0e4a7b79e3f5ed71db5f3950c91197217 Mon Sep 17 00:00:00 2001 From: Ivan Procaccini <ivanprocaccini905@gmail.com> Date: Tue, 23 Aug 2022 11:50:29 +0100 Subject: [PATCH] Feat: Add role-based automatic redirection on login --- app/mocks/ldap_authentication.py | 2 +- app/models/administration.py | 1 + app/views/auth.py | 11 ++++++-- .../versions/6dea3a5014b0_add_role_column.py | 28 +++++++++++++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 migrations/versions/6dea3a5014b0_add_role_column.py diff --git a/app/mocks/ldap_authentication.py b/app/mocks/ldap_authentication.py index 22c59b0..37399fb 100644 --- a/app/mocks/ldap_authentication.py +++ b/app/mocks/ldap_authentication.py @@ -20,7 +20,7 @@ DUMMY_USER_BASE = { "givenName": "Harry", "sn": "Potter", "distinguishedName": {"OU": ["doc"]}, - "extensionAttribute6": "Staff", + "extensionAttribute6": "Student", }, "adumble": { "name": "adumble", diff --git a/app/models/administration.py b/app/models/administration.py index 5fb8883..237b565 100644 --- a/app/models/administration.py +++ b/app/models/administration.py @@ -5,6 +5,7 @@ class AuthenticatedUser(db.Model): username = db.Column(db.String(10), primary_key=True) firstname = db.Column(db.String) surname = db.Column(db.String) + role = db.Column(db.String, nullable=False) def get_id(self): return self.username diff --git a/app/views/auth.py b/app/views/auth.py index 37b0a26..2f892bd 100644 --- a/app/views/auth.py +++ b/app/views/auth.py @@ -8,7 +8,7 @@ from werkzeug.utils import redirect from .. import messages, login_manager, ldap_service from ..database import db from ..forms import LoginForm -from ..ldap_authentication.authenticator import NAME, SURNAME +from ..ldap_authentication.authenticator import NAME, SURNAME, TITLE from ..models import AuthenticatedUser bp = Blueprint("auth", __name__) @@ -50,6 +50,7 @@ def login(): username=username, firstname=attributes.get(NAME, username.upper()), surname=attributes.get(SURNAME, ""), + role=normalize_role(attributes.get(TITLE)), ) db.session.add(user) db.session.commit() @@ -75,11 +76,17 @@ def logout(): ################################################################## # U T I L I T I E S ################################################################## + + +def normalize_role(ldap_role): + return "student" if ldap_role in {"Student", "PGT", "Casual"} else "staff" + + def to_next_page_or_home(next_pg): if next_pg and is_safe_url(request.host_url, next_pg): return next_pg else: - return url_for("student.projects") + return url_for(f"{current_user.role}.projects") def is_safe_url(request_host_url, target): diff --git a/migrations/versions/6dea3a5014b0_add_role_column.py b/migrations/versions/6dea3a5014b0_add_role_column.py new file mode 100644 index 0000000..1ccf7d9 --- /dev/null +++ b/migrations/versions/6dea3a5014b0_add_role_column.py @@ -0,0 +1,28 @@ +"""Add role column + +Revision ID: 6dea3a5014b0 +Revises: a3f30aab004c +Create Date: 2022-08-23 11:45:49.807695 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "6dea3a5014b0" +down_revision = "a3f30aab004c" +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column("authenticated_user", sa.Column("role", sa.String(), nullable=False)) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column("authenticated_user", "role") + # ### end Alembic commands ### -- GitLab