Как аутентифицировать пользователей с помощью ldap и записать данные приложения в mysql через флешку sqlalchemy - PullRequest
0 голосов
/ 05 февраля 2019

колба круд проект.

Прежде всего, я новичок в этом и простите меня, если вы считаете, что вопрос слишком простой, и я должен ответить: цель состоит в том, чтобы позволить пользователям войти в веб-приложение со своими именем пользователя и паролем.Аутентификация выполняется через ldap, и данные, которые собирает приложение, будут храниться в mysql, а также отслеживать, какой пользователь сохранил что и когда, но это второстепенная проблема.По большей части я следовал этому учебнику , который использовал MySQL для регистрации и входа в систему.Но в моем случае мне нужна только часть входа в систему, я попытался заменить имя входа на конфигурацию ldap, но мне не повезло заставить его работать.Может кто-нибудь помочь мне заставить это работать?

# app/auth/forms.py

from flask_wtf import FlaskForm
from wtforms import PasswordField, SelectField, StringField,                       SubmitField, ValidationError
from wtforms.validators import DataRequired #, Email, EqualTo

class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    submit = SubmitField('Login')


# app/auth/views.py
import ldap
from flask import flash, redirect, render_template, url_for, request, Blueprint, g
from flask_login import login_required, login_user, logout_user, current_user
from . import auth
from .forms import LoginForm 
from .. import db
from ..models import User 

@auth.before_request
def get_current_user():
    g.user = current_user

@auth.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        flash('You are already logged in.')
        return redirect(url_for('home.dashboard'))
    form = LoginForm(request.form)
    if request.method == 'Post' and form.validate():
        flash('username found')
        username = request.form.get('username')

        password = request.form.get('password')
        user = User.query.filter_by(username=username).first()
        try:
            User.try_login(username, password)
        except ldap.INVALID_CREDENTIALS:
            flash('Invalid username or password. Please try again.', 'danger')
            return render_template('auth/login.html', form=form)
        except ldap.NO_SUCH_OBJECT:
            flash('Invalid username. Please try again.', 'danger')
            return render_template('auth/login.html', form=form, title='Login')

        if not user:
            user = User(username, password)
            db.session.add(user)
            db.session.commit()
        login_user(user)

        if user.is_admin:

            return redirect(url_for('home.admin_dashboard'))
        else:

            return redirect(url_for('home.dashboard'))
    if form.errors:

        flash(form.errors, 'danger')

    return render_template('auth/login.html', form=form, title='Login')    


@auth.route('/logout')
@login_required
def logout():

    logout_user()
    flash('You have successfully been logged out.')
    return redirect(url_for('auth.login'))


# app/models.py

from flask_login import UserMixin 
from werkzeug.security import generate_password_hash, check_password_hash
import ldap
from app import db, login_manager
from datetime import datetime

def get_ldap_connection():

    __bind_key__ ='users'

    conn = ldap.initialize(app.config['SQLALCHEMY_BINDS'])
    return conn

class User(UserMixin, db.Model):

    # __bind_key__ = 'users'
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(100))
    is_admin = db.Column(db.Boolean, default=False)
    owners = db.relationship('Owners', backref='user', lazy='dynamic')

    def __init__(self, username, password):
        self.username = username

    @staticmethod
    def try_login(username, password):
        conn = get_ldap_connection()
        conn.simple_bind_s(
        'uid=%s,ou=People,dc=example, dc=com' % username, password
        )

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        return str(self.id)

@login_manager.user_loader
def load_user(id):
    return User.query.get(int(id))

class Owner(db.Model):

    __tablename__ = 'owners'

    id = db.Column(db.Integer, primary_key=True)
    owner_fname = db.Column(db.String(60), unique=True)
    owner_lname = db.Column(db.String(60), unique=True)
    email = db.Column(db.String(60), unique=True)
    phone = db.Column(db.String(15), unique=True)
    role = db.Column(db.String(60), unique=True) # this will should be a select field
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    departmen_id = db.Column(db.Integer, db.ForeignKey('departments.id'))
    machines = db.relationship('Machine', backref='owner', lazy='dynamic')
    location_id = db.Column(db.Integer, db.ForeignKey('locations.id'))

class Department(db.Model):
    __tablename__ = 'departments'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(60), unique=True) #this should be a list
    description = db.Column(db.String(200))
    owners = db.relationship('Owner', backref='department', lazy='dynamic')

    def __repr__(self):
        return '<Department: {}>'.format(self.name)

class Machine(db.Model):

    __tablename__ = 'machines'

    id = db.Column(db.Integer, primary_key=True)
    machine_type = db.Column(db.String(60), unique=True)

    serialortag = db.Column(db.String(60), unique=True)
    purchased_date = db.Column(db.DateTime)
    department = db.Column(db.String(60), unique=True)
    published_date = db.Column(db.DateTime, default=datetime.utcnow)
    description = db.Column(db.String(200), unique=True)
    owne_id = db.Column(db.Integer, db.ForeignKey('owners.id'))


    def __repr__(self):
        return '<Machine: {}>'.format(self.machine_type)
class Location(db.Model):

    __tablename__ = 'locations'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(60), unique=True) #list of places
    owners = db.relationship('Owner', backref='location', lazy='dynamic')

    def __repr__(self):

        return '<Location: {}>'.format(self.name)


# app/__init__.py

import os
from flask import Flask
import ldap
from flask_bootstrap import Bootstrap
from flask_login import LoginManager
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from flask import abort, Flask, render_template

# local imports
from config import app_config

db = SQLAlchemy()
login_manager = LoginManager()


def create_app(config_name):
    app = Flask(__name__, instance_relative_config=True)
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    app.config.from_object(app_config[config_name])
    app.config.from_pyfile('config.py')

    Bootstrap(app)
    db.init_app(app)
    login_manager.init_app(app)
    login_manager.login_message = "You must be logged in to access this page."
    login_manager.login_view = "auth.login"
    migrate = Migrate(app, db)

    from app import models

    from .admin import admin as admin_blueprint
    app.register_blueprint(admin_blueprint, url_prefix='/admin')

    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint)

    from .home import home as home_blueprint
    app.register_blueprint(home_blueprint)

    @app.errorhandler(403)
    def forbidden(error):
        return render_template('errors/403.html', title='Forbidden'), 403

    @app.errorhandler(404)
    def page_not_found(error):
        return render_template('errors/404.html', title='Page Not Found'), 404

    @app.errorhandler(500)
    def internal_server_error(error):
        return render_template('errors/500.html', title='Server Error'), 500

    @app.route('/500')
    def error():
         abort(500)

    return app


# instance/config.py

SECRET_KEY = 'p9Bv<3Eid9%$i01'

WTF_CSRF_SECRET_KEY="a csrf secret key"

# SQLALCHEMY_DATABASE_URI = 
SQLALCHEMY_BINDS = {
    'users':        'ldap://ldap.example.com:389',
    'appmeta': 'mysql://username:password@localhost/dreamdb'
 }
LDAP_PROTOCOL_VERSION = 3

Конечной целью является возможность входа на сервер ldap, а также возможность записи данных в базу данных mysql.Я провел бесчисленное количество поисков в Google безрезультатно, если у вас есть какой-либо ресурс, на который вы могли бы мне указать, это также было бы полезно.Заранее спасибо за помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...