From 194ef1951b3181035ff9eb34528ce1d7e7ba2a69 Mon Sep 17 00:00:00 2001 From: kelepirci Date: Sun, 7 Aug 2016 19:18:46 +0300 Subject: [PATCH] Roles and Verify Roles User roles system and verification implimented. --- dash/__init__.py | 3 ++ dash/admin/views.py | 6 +++- dash/auth/views.py | 5 ++-- dash/decorators.py | 16 +++++++++- dash/models.py | 1 - dash/templates/admin/sidebar_menu.html | 2 +- dash/templates/index.html | 2 +- dash/templates/navbar.html | 2 +- .../{9643649cdb9c_.py => 070b614d54f1_.py} | 12 +++++--- migrations/versions/ad5c9cae2c6d_.py | 26 ++++++++++++++++ migrations/versions/c751862fad43_.py | 30 ------------------- requirements.txt | 3 +- 12 files changed, 65 insertions(+), 43 deletions(-) rename migrations/versions/{9643649cdb9c_.py => 070b614d54f1_.py} (81%) create mode 100644 migrations/versions/ad5c9cae2c6d_.py delete mode 100644 migrations/versions/c751862fad43_.py diff --git a/dash/__init__.py b/dash/__init__.py index d9bc5f1..6532cdf 100644 --- a/dash/__init__.py +++ b/dash/__init__.py @@ -6,6 +6,7 @@ from flask_moment import Moment from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager from flask_debugtoolbar import DebugToolbarExtension +from flask.ext.principal import Principal from config import config @@ -15,6 +16,7 @@ mail = Mail() moment = Moment() db = SQLAlchemy() toolbar = DebugToolbarExtension() +Principal = Principal() # initialize flask_login login_manager = LoginManager() @@ -37,6 +39,7 @@ def create_app(config_name): moment.init_app(dash) db.init_app(dash) login_manager.init_app(dash) + Principal.init_app(dash) toolbar.init_app(dash) diff --git a/dash/admin/views.py b/dash/admin/views.py index 1f08935..20b9a89 100644 --- a/dash/admin/views.py +++ b/dash/admin/views.py @@ -3,13 +3,17 @@ import datetime from flask import render_template, redirect, request, url_for, flash from flask_login import login_user, logout_user, login_required, \ current_user +from flask_principal import Identity, AnonymousIdentity, \ + identity_changed from . import admin from .. import db from ..models import User from ..email import send_email +from ..decorators import requires_roles -@admin.route('/') +@admin.route('/index') @login_required +@requires_roles("admin") def for_admins_only(): return render_template('admin/index.html') \ No newline at end of file diff --git a/dash/auth/views.py b/dash/auth/views.py index b7cf2b0..a20245a 100644 --- a/dash/auth/views.py +++ b/dash/auth/views.py @@ -4,7 +4,7 @@ from flask_login import login_user, logout_user, login_required, \ current_user from . import auth from .. import db -from ..models import User +from ..models import User, Role from ..email import send_email from .forms import LoginForm, RegistrationForm, PasswordResetRequestForm, \ PasswordResetForm @@ -45,13 +45,14 @@ def logout(): def register(): form = RegistrationForm() if form.validate_on_submit(): + r = Role.query.filter_by(default=True).first() user = User(email=form.email.data, username=form.username.data, full_name=form.full_name.data, password=form.password.data, avatar="/static/img/user2-160x160.jpg", created_at=datetime.datetime.now(), - role_id=2) + role_id=r.id) db.session.add(user) db.session.commit() token = user.generate_confirmation_token() diff --git a/dash/decorators.py b/dash/decorators.py index 0b038e0..3533abd 100644 --- a/dash/decorators.py +++ b/dash/decorators.py @@ -1,4 +1,18 @@ from functools import wraps -from flask import abort +from flask import abort, redirect, request, url_for, flash from flask_login import current_user + +def requires_roles(*roles): + def wrapper(f): + @wraps(f) + def wrapped(*args, **kwargs): + if get_current_user_role() not in roles: + flash('Authentication error, please check your details and try again','error') + return redirect(url_for('main.index')) + return f(*args, **kwargs) + return wrapped + return wrapper + +def get_current_user_role(): + return current_user.role.name \ No newline at end of file diff --git a/dash/models.py b/dash/models.py index b8456f0..8f187cb 100644 --- a/dash/models.py +++ b/dash/models.py @@ -17,7 +17,6 @@ class Role(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(128), unique=True) default = db.Column(db.Boolean, default=False, index=True) - permissions = db.Column(db.Integer) users = db.relationship('User', backref='role', lazy='dynamic') def __repr__(self): diff --git a/dash/templates/admin/sidebar_menu.html b/dash/templates/admin/sidebar_menu.html index 33cdd17..508aae7 100644 --- a/dash/templates/admin/sidebar_menu.html +++ b/dash/templates/admin/sidebar_menu.html @@ -1,7 +1,7 @@