添加Flask用户登录要求

时间:2019-06-24 09:53:37

标签: python authentication flask flask-login flask-security

我正在使用Flask-Security,后者又使用Flask-Login。我有一个网站,要求用户既确认他们的电子邮件地址,又要得到管理员的批准。没有这两个方面,我不希望用户能够使用该网站。

我已打开SECURITY_CONFIRMABLE,并且带有确认令牌的电子邮件已正确发送。我设置了SECURITY_POST_CONFIRM_VIEW,一旦用户单击电子邮件中的确认链接,就将其定向到正确的视图。但是,用户已登录 as part of the confirmation process。在管理员批准之前,我不希望用户具有访问权限。 (有趣的是,develop分支中的this line is not present。)

我可以想到四种方法来解决此问题,而且没有一种方法特别有吸引力:

  1. 允许用户在确认后登录,但是使用检查用户权限并将其发送到错误页面(如果不允许)的功能修饰每个login_required视图。我已经有2个了,我希望避免在每个视图中添加第三个。另外,当用户在获得批准之前无法使用该网站时,允许登录是不对的。

  2. 关闭SECURITY_CONFIRMABLE并自己通过电子邮件发送/确认令牌。这将需要复制大量代码,并且出错的可能性比我想要的要高。用户也许还有其他登录方式可以绕过此检查?说通过密码重置流程?或者,如果将来的管理员打开了使用令牌的无密码登录?

  3. 用猴子补丁Flask-Security的login_user或Flask-Login的login_user进行检查。似乎很hacky,而且我不知道如何确保在任何其他代码连接到原始功能之前先安装补丁。

  4. 派生这些库之一,并插入一个我可以在代码中实现的回调。大锤,见螺母。加上可维护性问题。除非我设法获得了PR。

我希望我还有另一个答案。这可能不是一种罕见的设置!

1 个答案:

答案 0 :(得分:0)

幸运的是,解决方案比我担心的要容易得多。 UserMixin有一个is_active属性,在Flask-Login的login_user的一开始就被引用。所以我的代码看起来像这样:

class User(UserMixin, Base):
    @property
    def is_active(self):
        return (super(UserMixin, self).is_active and not self.has_role('pending'))

现在没有用户可以登录具有“待定”角色的人。