2013-04-08 35 views
12

ユーザーとして機能する複数のクラス(たとえば、学校アカウントとスタッフアカウント)を持つアプリケーションを作成しています。私はこれを簡単にするためにFlask-Loginを使用しようとしていますが、ユーザーのログイン時にユーザー名が学校アカウントに属しているかどうかを確認することができますまたはスタッフのアカウントにログインし、適切にログインします。私はどのようにタイプのアカウントを所有している必要がある(すべてのユーザー名は一意でなければならない)ので、特定のユーザーにログインするようにアプリに指示する方法はわかりません。今、ユニバーサルログインページは1つしかありません。スタッフアカウントと学校アカウントのログインページを別にすれば簡単ですか? Flask-SQLAlchemyを使用してMySQLデータベースを使用しています。どんな助けもありがとう。複数のユーザークラスでFlask-Loginを実装する

+0

あなたがしようとしていることを単純化する方法は、Flask-SQLAlchemyを使用しているので、ユーザーごとに多くの異なるクラスがなく、継承を使用しないように、ロールを使用することです。 – lv10

+0

問題は、別のデータを持つ既存のデータベースを使用していることです。 –

答えて

23

特定の役割を持つ各ユーザーを定義することができます。たとえば、ユーザー '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 
+0

問題は、別のSCHOOLおよびSTAFFデータベースにデータがある既存のデータベースがあることです。この方法はまだ可能だろうと思いますか?データベースに関係なく、学校やスタッフのアカウントをラップする一般的なユーザークラスを作成できますか? –

+0

私はかなりあなたに従っているかどうかはわかりませんが、通常は1つのデータベーステーブルに対応する1つの汎用Userクラス/モデルが必要です。上記で説明したように、「役割」の概念を使用することを強くお勧めします。それはとてもうまくいく。 – codegeek

+1

これは私が取ったアプローチです。明確で有用な答えをいただきありがとうございます。 – tmthyjames

3

これはあなたができることの例です。私は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

4

@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 
1

Flask-Securityから「ロール管理」を見てみましょう。 Flask-Loginと簡単に統合できます。

関連する問題