diff --git a/app.py b/app.py index dc8f7eb..2cd25f2 100644 --- a/app.py +++ b/app.py @@ -12,7 +12,7 @@ app.register_blueprint(dash_blueprint, url_prefix="/dash") # Default app route @app.route("/") def home(): - return redirect(url_for("auth.demo")) + return redirect(url_for("auth.login")) if __name__ == "__main__": diff --git a/app_seed.py b/app_seed.py index 949f954..55c4587 100644 --- a/app_seed.py +++ b/app_seed.py @@ -1,5 +1,6 @@ from application import db, app from application.dashboard.models import AllowedPlate, LoggedItem, datetime +from application.auth.models import User with app.app_context(): AllowedPlate.query.delete() @@ -11,3 +12,8 @@ with app.app_context(): db.session.add(LoggedItem("MUN389", datetime.now(), True)) db.session.add(LoggedItem("MUN389", datetime.now(), False)) db.session.commit() + +with app.app_context(): + User.query.delete() + db.session.add(User(username="admin", password="admin")) + db.session.commit() diff --git a/application/__init__.py b/application/__init__.py index 3b41ab7..7f6faba 100644 --- a/application/__init__.py +++ b/application/__init__.py @@ -1,6 +1,7 @@ from flask import Flask from flask_migrate import Migrate from flask_sqlalchemy import SQLAlchemy +from flask_login import LoginManager # from authlib.integrations.flask_client import OAuth @@ -16,6 +17,20 @@ db = SQLAlchemy(app) migrate = Migrate(app, db) +# Login manager +from application.auth.models import User + +login_manager = LoginManager() +login_manager.init_app(app) # type: ignore +login_manager.login_view = "auth.login" # type: ignore + + +# Gets all the user data +@login_manager.user_loader # type: ignore +def load_user(user_id): # type: ignore + return User.query.get(int(user_id)) # type: ignore + + # Keycloak """ oauth = OAuth(app=app) diff --git a/application/auth/forms.py b/application/auth/forms.py new file mode 100644 index 0000000..c3f022e --- /dev/null +++ b/application/auth/forms.py @@ -0,0 +1,9 @@ +from flask_wtf import FlaskForm +from wtforms import StringField, SubmitField, PasswordField +from wtforms.validators import DataRequired + + +class login_form(FlaskForm): + username = StringField("Username", validators=[DataRequired()]) + password = PasswordField("Password", validators=[DataRequired()]) + submit = SubmitField(label="Sign in") diff --git a/application/auth/models.py b/application/auth/models.py new file mode 100644 index 0000000..49f45f8 --- /dev/null +++ b/application/auth/models.py @@ -0,0 +1,19 @@ +from application import db +from flask_login import UserMixin +from werkzeug.security import generate_password_hash, check_password_hash + + +# User model +class User(db.Model, UserMixin): + __tablename__ = "user" + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(150), unique=True, nullable=False) + password = db.Column(db.String, nullable=False) + + # Initialize user, prevents red stuff + def __init__(self, username: str, password: str, is_admin: bool = False): + self.username = username + self.password = generate_password_hash(password) + + def check_password(self, password: str): + return check_password_hash(self.password, password=password) diff --git a/application/auth/templates/login.html b/application/auth/templates/login.html new file mode 100644 index 0000000..1f6f76f --- /dev/null +++ b/application/auth/templates/login.html @@ -0,0 +1,85 @@ + + + +
+ + + +
+
+