23

ユーザーとして機能する複数のクラス (学校アカウントとスタッフ アカウントなど) を持つアプリを作成しています。これを簡単にするために Flask-Login を使用しようとしていますが、その方法がよくわかりません。そのため、ユーザーがログインしたときに、ユーザー名が学校のアカウントに属しているかどうかをアプリに確認させることができますまたはスタッフ アカウントを選択して、適切にログインします。

どのタイプのアカウントに属しているかを把握する方法を知っています (すべてのユーザー名は一意でなければならないため)。しかし、その後、その特定のユーザーにログインさせたいことをアプリに伝える方法がわかりません。

現在、ユニバーサル ログイン ページは 1 つしかありません。教職員用アカウントと学校用アカウントでログインページを分けたほうが楽ですか?Flask-SQLAlchemy を通じて MySQL データベースを使用しています。

4

6 に答える 6

49

各ユーザーに特定の役割を定義できます。たとえば、ユーザー「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

ただし、Flask-login にはまだユーザー ロールの概念がなく、それをオーバーライドする独自のバージョンの login_required デコレータを作成しました。したがって、次のようなものを使用することをお勧めします。

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

次に、次のようなビュー関数でこのデコレータを使用できます。

@app.route('/school/')
@login_required(role="SCHOOL")
def restricted_view_for_school():
    pass
于 2013-04-08T16:59:50.360 に答える
5

これはあなたができることの例です。Flask-SQLAlchemy を使用した経験はありませんが、方法はそれほど変わらないはずです。以下の例では、SQLAlchemy を直接使用しています。

Base最初に、ORM (宣言型) によってマップできるように、継承するユーザー クラスを定義します。

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
    }

親クラス クラスの準備ができたら、必要な役割ごとに異なるクラスを設定します。

class SchoolAccount(User):
    __tablename__ = 'school_account'
    id = Column(Integer, ForeignKey('user_table.id'), primary_key=True)
    representative_name = Column(String(45))

    __mapper_args__ = {
        'polymorphic_identity': 'school_account'
    } 

Flask-Login を使用してユーザーをログインし、ロールに基づいてアクセスを制限します。

以下は、2 つの異なる役割を持つログイン システムの例です。これは、flask、flask-sqlalchemy、flask-login の優れたチュートリアルです: http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-v-user-logins

于 2013-04-08T14:37:03.860 に答える
3

Flask-Security の「Role Management」を見てください。Flask-Login と簡単に統合できます。

于 2015-07-29T17:02:21.170 に答える