Nov-14-2017, 08:29 PM
I'm trying to put together a flask blueprint for LDAP3 auth. I started out with a standard flask app and that works fine but as soon as I turn it into a blueprint, it fails to work as expected.
Here's the debug output when I run the flask app
Here's the debug output when I run the flask app
Output:DEBUG:root:Validating LDAPLoginForm against LDAP
DEBUG:flask_ldap3_login:Opening connection with bind user '[email protected]'
DEBUG:flask_ldap3_login:Successfully bound to LDAP as '[email protected]' for search_bind method
DEBUG:flask_ldap3_login:Performing an LDAP Search using filter '(&(objectclass=person)(sAMAccountName=YYYY))', base 'ou=Users,ou=XXXX,dc=XXXX,dc=COM', and scope 'SUBTREE'
DEBUG:flask_ldap3_login:Opening connection with bind user 'CN=YYYY,OU=Admin Users,OU=Users,OU=XXXX,DC=XXXX,DC=COM'
DEBUG:flask_ldap3_login:Directly binding a connection to a server with user:'CN=YYYY,OU=Admin Users,OU=Users,OU=XXXX,DC=XXXX,DC=COM'
DEBUG:flask_ldap3_login:Authentication was successful for user 'YYYY'
And here's the debug output when run as a blueprintOutput:DEBUG:root:Validating LDAPLoginForm against LDAP
DEBUG:flask_ldap3_login:Opening connection with bind user '[email protected]'
DEBUG:flask_ldap3_login:Destroying connection at <0x7f181f9ee2b0>
ERROR:flask_ldap3_login:Uninitialized ASN.1 value ("__len__" attribute looked up)
My __init__.py looks like this:from flask import Flask app = Flask(__name__) app.config.from_object('config') from app.ldauth.views import auth_blueprint app.register_blueprint(auth_blueprint)And app/ldauth/views.py looks like this:
from flask import Flask, Blueprint, url_for from flask_ldap3_login import LDAP3LoginManager from flask_login import LoginManager, login_user, UserMixin, current_user from flask import render_template_string, render_template, redirect from flask_ldap3_login.forms import LDAPLoginForm from app import app auth_blueprint = Blueprint('ldauth',__name__,template_folder='templates') login_manager = LoginManager(app) ldap_manager = LDAP3LoginManager(app) users = {} class User(UserMixin): def __init__(self, dn, username, data): self.dn = dn self.username = username self.data = data def __repr__(self): return self.dn def get_id(self): return self.dn @login_manager.user_loader def load_user(id): if id in users: return users[id] return None @ldap_manager.save_user def save_user(dn, username, data, memberships): user = User(dn, username, data) users[dn] = user return user @auth_blueprint.route('/login', methods=['GET', 'POST']) def login(): template = """ {{ get_flashed_messages() }} {{ form.errors }} <form method="POST"> <label>Username{{ form.username() }}</label> <label>Password{{ form.password() }}</label> {{ form.submit() }} {{ form.hidden_tag() }} </form> """ # Instantiate a LDAPLoginForm which has a validator to check if the user # exists in LDAP. form = LDAPLoginForm() if form.validate_on_submit(): # Successfully logged in, We can now access the saved user object # via form.user. login_user(form.user) # Tell flask-login to log them in. # TODO: Validate next to ensure it is safe! return redirect(next) # Send them home return render_template_string(template,form=form)Fairly inexperienced with python so maybe I am just doing something fundamentally wrong here. Any suggestions?