用户登录的方式多种多样,而通过插件添加用户登录前必须满足的条件则较为困难。
插件作者可能希望为身份验证添加的条件示例如下:
- 确保用户的电子邮件域名符合特定模式,例如 university.edu
- 通过双因素认证(2FA)提供商验证第二因素(此类提供商似乎有很多)
- 确保用户通过支付提供商拥有有效订阅
当前的条件检查(或不检查)因上下文而异(非详尽列表):
-
- 通过
create方法:密码正确、用户已批准、用户激活、用户邮箱已确认、TOTP 第二因素、用户被暂停、IP 地址正确/错误 - 通过
email_login方法:TOTP 第二因素、用户已批准、用户被暂停、IP 地址正确/错误
- 通过
-
- 通过
logon_after_password_reset:用户已批准(注意此处使用新的Guardian实例进行检查)、用户为工作人员
- 通过
-
- 通过
perform_accept_invitation:用户激活
- 通过
一种插入自定义条件的方法是预置一个自定义模块来修改每个方法,但这从维护与 Discourse 兼容性的角度来看并非理想方案,且实现方式也较为丑陋。
建议
如果身份验证逻辑不那么分散在代码库中,开发将会更加容易。所有可能需要检查的条件(以及相应的错误消息)都可以定义在单一位置作为独立方法。希望登录的用户必须通过所有已启用的条件。作为插件作者,您可以向该类添加自己的方法,log_on_user 方法将会检查这些方法。如果您希望在特定上下文中跳过某个条件,可以传递相应参数来实现。