パスワードベースのシステムではなく、OAuth経由でログインするサイトで作業しています。Flask-Security/loginエンドポイントを無効にする
このため、Flask-Securityのデフォルトのログインページは、OAuth設定のエンドポイントが/login
であるため、実際には私のユースケースでは機能しません。私はのルートがFlask-Security'sによって無効にされていないように、SECURITY_LOGIN_URL
設定オプションを変更することができました。
これはすべて正常に動作しています.OAuthログインページが表示され、必要なすべての情報が返されます。
私も@login_required
デコレータを利用しようとしているので、この問題が起こります。
/login
ページにリダイレクトするのではなく、@login_required
デコレータがFlask-Securityのページにリダイレクトしています。
明らかに、configエンドポイントはこの状況では役に立ちません。
Flask-Securityにページの代わりにログインルート(OAuth)を使用させることは可能ですか?
は、ここで私はフラスコ-セキュリティが定義されたルートを上書きして話しているかを示していくつかのサンプルコードです:Funnily十分
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, request
from flask_security import (Security, SQLAlchemyUserDatastore,
UserMixin, RoleMixin, login_required,
login_user, logout_user, current_user)
from passlib.context import CryptContext
import os
class Config:
basedir = os.path.abspath(os.path.dirname(__file__))
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db')
SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository')
SQLALCHEMY_TRACK_MODIFICATIONS = False
DEBUG = True
PORT = 8000
HOST = "0.0.0.0"
SECRET_KEY = "foobar123"
config = Config()
app = Flask(__name__, instance_relative_config=True)
app.config.from_object(config)
db = SQLAlchemy(app)
lm = LoginManager()
lm.init_app(app)
lm.login_view = "login"
roles_users = db.Table('roles_users',
db.Column('user_id',
db.Integer(),
db.ForeignKey('user.id')),
db.Column('role_id',
db.Integer(),
db.ForeignKey('role.id'))
)
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
provider_id = db.Column(db.String(64), index=True, unique=True)
@property
def is_authenticated(self):
return True
@property
def is_active(self):
return True
@property
def is_anonymous(self):
return True
def get_id(self):
return str(self.id)
def hash_password(self, password):
self.hashed_password = pwd_context.encrypt(password)
def verify_password(self, password):
return pwd_context.verify(password, self.hashed_password)
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
description = db.Column(db.String(255))
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)
pwd_context = CryptContext(
schemes=["bcrypt", "pbkdf2_sha256", "des_crypt"],
default="bcrypt",
all__vary_rounds=0.1
)
@lm.user_loader
def load_user(id):
return User.query.get(int(id))
@app.route("/")
@app.route("/index")
@login_required
def index():
"""Handles calls to/and /index, return the panel"""
return render_template("index.html")
@app.route("/login")
def login():
"""Would include a bunch of OAuth stuff, not required for this example
If you try going to this endpoint, you'll get the Flask-Security /login
instead."""
return render_template("login.html")
app.run(debug=True)