From 9ee0565ac41661a0521630fbfe1ea9e896fcec52 Mon Sep 17 00:00:00 2001 From: "Jose M. Guisado" Date: Fri, 5 Mar 2021 11:06:11 +0100 Subject: [PATCH] Add login Ogcp requires a simple login page in order to avoid exposure of the ogServer API to anyone trying to access the web page. Because the main authorization mechanism in ogServer is the api token the login implemented for the ogcp does not include registration process but a single user and password specified in the ogcp.json. "USER": "user", "PASS": "pass" Adds two new views: /login and /logout. They are used to login the user so that the rest of views regarding ogServer functionality can be accessed in a "login required" fashion. Index view (/) is an exception, it can be accessed logged in or not so different data can be displayed. Templates can now access a variable "current_user" to get information about login status. This is a Flask-Login feature. - Templates regarding login can be found in templates/auth/ - Login form is defined in forms/auth.py to separate it from action_forms.py - Adds Flask-Login module to requirements.txt - Adds default user and pass in ogcp.json --- ogcp/cfg/ogcp.json | 2 ++ ogcp/forms/auth.py | 20 ++++++++++++ ogcp/models.py | 5 +++ ogcp/templates/auth/login.html | 12 +++++++ ogcp/templates/base.html | 2 ++ ogcp/templates/nav.html | 18 +++++++++++ ogcp/views.py | 57 ++++++++++++++++++++++++++++++++++ requirements.txt | 1 + 8 files changed, 117 insertions(+) create mode 100644 ogcp/forms/auth.py create mode 100644 ogcp/models.py create mode 100644 ogcp/templates/auth/login.html diff --git a/ogcp/cfg/ogcp.json b/ogcp/cfg/ogcp.json index 9e715d4..cff1cad 100644 --- a/ogcp/cfg/ogcp.json +++ b/ogcp/cfg/ogcp.json @@ -2,4 +2,6 @@ "IP": "127.0.0.1", "PORT": 8888, "API_TOKEN": "c3fe7bb0395747ec42a25df027585871" + "USER": "user", + "PASS": "pass" } diff --git a/ogcp/forms/auth.py b/ogcp/forms/auth.py new file mode 100644 index 0000000..8c84e84 --- /dev/null +++ b/ogcp/forms/auth.py @@ -0,0 +1,20 @@ +from wtforms import ( + Form, SubmitField, HiddenField, SelectField, BooleanField, IntegerField, + StringField, RadioField, PasswordField +) +from wtforms.validators import InputRequired +from flask_wtf import FlaskForm +from flask_babel import _ + +class LoginForm(FlaskForm): + user = StringField( + label=_('User'), + validators=[InputRequired()] + ) + pwd = PasswordField( + label=_('Password'), + validators=[InputRequired()] + ) + submit = SubmitField( + label=_('Login') + ) diff --git a/ogcp/models.py b/ogcp/models.py new file mode 100644 index 0000000..668c623 --- /dev/null +++ b/ogcp/models.py @@ -0,0 +1,5 @@ +from flask_login import UserMixin + +class User(UserMixin): + def get_id(self): + return 1 diff --git a/ogcp/templates/auth/login.html b/ogcp/templates/auth/login.html new file mode 100644 index 0000000..220f69e --- /dev/null +++ b/ogcp/templates/auth/login.html @@ -0,0 +1,12 @@ +{% extends 'base.html' %} +{% import "bootstrap/wtf.html" as wtf %} + +{% block content %} + +{{ wtf.quick_form(form, + method='post', + form_type='basic', + button_map={'submit':'primary'}, + extra_classes='p-5') }} + +{% endblock %} diff --git a/ogcp/templates/base.html b/ogcp/templates/base.html index 5f07fe7..3f55555 100644 --- a/ogcp/templates/base.html +++ b/ogcp/templates/base.html @@ -17,6 +17,8 @@