колба круд проект.
Прежде всего, я новичок в этом и простите меня, если вы считаете, что вопрос слишком простой, и я должен ответить: цель состоит в том, чтобы позволить пользователям войти в веб-приложение со своими именем пользователя и паролем.Аутентификация выполняется через 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 безрезультатно, если у вас есть какой-либо ресурс, на который вы могли бы мне указать, это также было бы полезно.Заранее спасибо за помощь