实施烧瓶登录多用户类(Implementing Flask-Login with multiple

2019-08-20 05:34发布

我正在写有作为的用户此功能多类应用程序(例如,一个学校的帐户和员工帐户)。 我试图用瓶,登录,使这个容易,但我不太清楚如何使它,所以,当我在用户登录可以有我的应用程序检查,以查看用户名是否属于学校帐户或员工帐户,然后适当地登录。

我知道如何找出它属于哪种类型的账户来(因为所有的用户名必须是唯一的)。 但在那之后,我不知道如何告诉我希望它登录特定用户的应用程序。

现在,我只有一个通用的登录页面。 它是比较容易,如果我做职员帐户和学校账户单独登录页面? 我使用过的烧瓶SQLAlchemy的MySQL数据库。

Answer 1:

您可以定义与特定角色的每个用户。 例如,用户的“x”可以是学院而用户的“y”可以是“职工”。

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装饰的版本重写。 所以,你可能想使用这样的:

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


Answer 2:

@codegeek我发现这是非常有用的,谢谢。 我不得不修改代码一点得到它为我工作,所以我想我会在这里掉落的情况下,它可以帮助别人:

from functools import wraps

login_manager = LoginManager()

...

def login_required(role="ANY"):
    def wrapper(fn):
        @wraps(fn)
        def decorated_view(*args, **kwargs):
            if not current_user.is_authenticated():
              return login_manager.unauthorized()
            if ((current_user.role != role) and (role != "ANY")):
                return login_manager.unauthorized()
            return fn(*args, **kwargs)
        return decorated_view
    return wrapper


Answer 3:

这是你可以做一个例子。 我没有使用烧瓶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'
    } 

使用烧瓶登录您登录基于角色的用户身份和限制访问。

这里是一个登录系统的两个不同角色的例子。 这是烧瓶,烧瓶的SQLAlchemy,烧瓶登录一个很好的教程: http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-v-user-logins



Answer 4:

看看从“角色管理” 瓶,安全 。 它可以与烧瓶登录轻松集成。



Answer 5:

一种选择是将瓶用户通过@ LV10答复中提到。 它实现了一个抽象的用户,处理很多事情,其中之一就是基于角色的认证 。

该代码将保持基本相同@codegeek的答案,但在用户级“urole”属性应该被重新命名为“角色”和角色必须与“名”属性(你可以复制粘贴一类的文档 )。 你将不再需要定义login_required,因为作为roles_required它已经实现。 所以,与其@login_required(role='rolename')我们@roles_required('rolename')

我刚开始使用这个API出于安全原因和它作为一个伟大的经验。 我强烈推荐给任何人与密码,用户认证和用户角色的问题。



文章来源: Implementing Flask-Login with multiple User Classes