2016-05-05 4 views
3

パスワードベースのシステムではなく、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) 

答えて

2

、今日は非常に同様の問題に遭遇しました。 私はSOの答えに十分なエレガントな方法で解決することができたら、これを更新します。一方で、問題にアプローチするための戦略上の私の考えは以下のとおりです。

  1. サブクラスフラスコセキュリティおよび過負荷のみ@login_requiredデコレータは、適切な場所にリダイレクトします。リダイレクトが唯一の問題であればおそらく最も速いでしょう。
  2. Oauthを単独で使用している場合は、別のデコレータを使用して@login_requiredを置き換えてください。 Flask-OAuthlibは宣誓書のための有用なライブラリであり、documents show you how to protect a resourceは `@auth.require_oauth 'デコレータを使用しています。

Flask-Stormpathは商業的な解決策であり、私はこれがこの特定の地面をカバーしているかどうかについては十分に言及していないので、可能なアプローチとして推奨しません。しかし、for background readingには、Flaskに関連する認証ホーネッツネストの有用な概要があります。

関連する問題