ユーザーとして機能する複数のクラス(たとえば、学校アカウントとスタッフアカウント)を持つアプリケーションを作成しています。私はこれを簡単にするためにFlask-Loginを使用しようとしていますが、ユーザーのログイン時にユーザー名が学校アカウントに属しているかどうかを確認することができますまたはスタッフのアカウントにログインし、適切にログインします。私はどのようにタイプのアカウントを所有している必要がある(すべてのユーザー名は一意でなければならない)ので、特定のユーザーにログインするようにアプリに指示する方法はわかりません。今、ユニバーサルログインページは1つしかありません。スタッフアカウントと学校アカウントのログインページを別にすれば簡単ですか? Flask-SQLAlchemyを使用してMySQLデータベースを使用しています。どんな助けもありがとう。複数のユーザークラスでFlask-Loginを実装する
答えて
特定の役割を持つ各ユーザーを定義することができます。たとえば、ユーザー 'x'はSCHOOLになり、ユーザー 'y'は 'STAFF'になります。
class User(db.Model):
__tablename__ = 'User'
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(80),unique=True)
pwd_hash = db.Column(db.String(200))
email = db.Column(db.String(256),unique=True)
is_active = db.Column(db.Boolean,default=False)
urole = db.Column(db.String(80))
def __init__(self,username,pwd_hash,email,is_active,urole):
self.username = username
self.pwd_hash = pwd_hash
self.email = email
self.is_active = is_active
self.urole = urole
def get_id(self):
return self.id
def is_active(self):
return self.is_active
def activate_user(self):
self.is_active = True
def get_username(self):
return self.username
def get_urole(self):
return self.urole
フラスコ-ログインはしかし、まだユーザの役割の概念を持っていないと私はそれを上書きするlogin_requiredデコレータの私の独自のバージョンを書きました。私はこの非常に便利な、感謝を発見した
@app.route('/school/')
@login_required(role="SCHOOL")
def restricted_view_for_school():
pass
問題は、別のSCHOOLおよびSTAFFデータベースにデータがある既存のデータベースがあることです。この方法はまだ可能だろうと思いますか?データベースに関係なく、学校やスタッフのアカウントをラップする一般的なユーザークラスを作成できますか? –
私はかなりあなたに従っているかどうかはわかりませんが、通常は1つのデータベーステーブルに対応する1つの汎用Userクラス/モデルが必要です。上記で説明したように、「役割」の概念を使用することを強くお勧めします。それはとてもうまくいく。 – codegeek
これは私が取ったアプローチです。明確で有用な答えをいただきありがとうございます。 – tmthyjames
これはあなたができることの例です。私はFlask-SQLAlchemyを使っている経験はありませんが、どう違うのでしょうか。以下の例では、SQLAlchemyを直接使用しています。
まず、あなたがあなたの親クラスのクラスの準備ができたら、それはORMでマップすることができるようにBase
を継承するユーザークラス(宣言)
class User(Base):
__tablename__ = 'user_table'
id = Column(Integer, primary_key=True)
email = Column(String(45), unique=True)
name = Column(String(45))
pwd = Column(String(8))
user_role = Column(String(15))
__mapper_args__ = {
'polymorphic_identity': 'user_table',
'polymorphic_on': user_role
}
を定義する役割ごとに異なるクラスを設定しますあなたは持ちたいと思う。
Flask-Loginを使用すると、ユーザーにログインし、役割に基づいてアクセスを制限します。
次に、2つの異なる役割を持つログインシステムの例を示します。これは、フラスコ、フラスコ - サルカルシウム、フラスコログインの良いチュートリアルです。http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-v-user-logins
@codegeek:あなたは次のようにビュー機能で、このデコレータを使用することができ、その後
def login_required(role="ANY"):
def wrapper(fn):
@wraps(fn)
def decorated_view(*args, **kwargs):
if not current_user.is_authenticated():
return current_app.login_manager.unauthorized()
urole = current_app.login_manager.reload_user().get_urole()
if ((urole != role) and (role != "ANY")):
return current_app.login_manager.unauthorized()
return fn(*args, **kwargs)
return decorated_view
return wrapper
:だからあなたのようなものを使用することをお勧めします。私はそれが私のために働い取得するコードを少し変更する必要がありましたので、私はそれが他の誰かを助けることができる場合には、私はここでそれをドロップしたい考え出し:
from functools import wraps
def login_required(role="ANY"):
def wrapper(fn):
@wraps(fn)
def decorated_view(*args, **kwargs):
if not current_user.is_authenticated():
return lm.unauthorized()
if ((current_user.role != role) and (role != "ANY")):
return lm.unauthorized()
return fn(*args, **kwargs)
return decorated_view
return wrapper
がFlask-Securityから「ロール管理」を見てみましょう。 Flask-Loginと簡単に統合できます。
- 1. 複数のDLLで別々のクラス実装を実装する
- 2. ビットマップゲームオブジェクトの複数インスタンスを実装する
- 3. Androidの複数の実装
- 4. PHPでの複数のマップの実装
- 5. 複数のファイルでのクラスの実装
- 6. 複数指数化の実装
- 7. 複数のプラットフォームの実装を扱う
- 8. 複数のGridViewを持つViewFlipperでスワイプアクションを実装する
- 9. Redisの複数のノードでCuckooフィルターを実装する
- 10. 複数のリストの反応でドラッグ&ドロップを実装する
- 11. 複数のバージョンでapiのバックエンドを実装する方法
- 12. Autofac - 複数の実装を使用
- 13. iPhoneで複数のビューを実装する
- 14. 次のコードでspannableを複数回実装する方法は?
- 15. JQueryで複数のif/else文を実装する方法は?
- 16. mysqlで複数のNULLチェックトランザクションを実装する方法
- 17. WebApiで複数のGetメソッドを実装する方法
- 18. 複数のワークスペースでワトソン会話を実装する方法
- 19. 同じテストで複数のインタフェース実装をテストする - JUnit4
- 20. 複数の行レイアウトでAndroidリストビューを実装する
- 21. RecyclerViewチャットウィンドウ内で複数のレイアウトを実装する
- 22. TreeTableView/TableViewで複数行のドラッグドロップを実装する方法は?
- 23. SQL Serverで複数の関係を実装する方法は?
- 24. 複数のレベルで逆方向リンクを実装する
- 25. 複数のプロデューサ(ゴルーチン付き)でセマフォを実装する
- 26. Javaで複数次元のAdaboostを実装する
- 27. TableView内で複数のPickerViewを実装する
- 28. Cocos2dで複数のCCSpritesにタッチを実装する方法は?
- 29. swift3でuitableの複数選択を実装する方法は?
- 30. laravelで複数のフィールド検索を実装する方法は?
あなたがしようとしていることを単純化する方法は、Flask-SQLAlchemyを使用しているので、ユーザーごとに多くの異なるクラスがなく、継承を使用しないように、ロールを使用することです。 – lv10
問題は、別のデータを持つ既存のデータベースを使用していることです。 –