使用多个用户类实现 Flask-Login

新手上路,请多包涵

我正在编写一个应用程序,该应用程序具有多个充当用户的类(例如,学校帐户和员工帐户)。我正在尝试使用 Flask-Login 来简化这件事,但我不太确定如何做到这一点,这样当用户登录时,我可以让我的应用程序检查用户名是否属于学校帐户或员工帐户,然后正确登录。

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

现在,我只有一个通用登录页面。如果我为员工帐户和学校帐户制作单独的登录页面会更容易吗?我通过 Flask-SQLAlchemy 使用 MySQL 数据库。

原文由 Ashu Goel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 749
2 个回答

您可以为每个用户定义特定角色。例如,用户“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

原文由 codegeek 发布,翻译遵循 CC BY-SA 3.0 许可协议

我不得不稍微修改 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

原文由 Chockomonkey 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题