覆盖 Meteor 的默认登录处理程序

7
我正在使用NPM ldapjsMeteor LDAP项目,尝试在我的测试Telescope网站上启用LDAP。主要问题是我希望LDAP成为唯一的登录方法。我的计划是在内置的Telescope(Meteor?)登录方法周围包装一个函数。如果LDAP凭证通过,则运行Telescope登录脚本并继续正常操作。

也许这是一个取巧的解决方案,更好的方案可能存在?无论如何,我需要让LDAP工作。现在,我正在尝试使用以下代码重写默认的登录方法:
Template.signin.events({
    'submit': function(event, template){
        Session.set('errorMessage', null);
        event.preventDefault();
        console.log("My login script ran!"); // I never see this message =(
        return Meteor.loginWithLDAP(template.find('#login-username').value,
            template.find('#login-password').value, function(error) {

            return Session.set('errorMessage', 'Login failed');
        });
    }
});

正如评论所说,log命令从未运行(我知道这是因为我正在使用Chrome,在尝试登录后控制台为空白),此外,每次页面加载时我都会得到以下内容:

Uncaught TypeError: Cannot read property 'events' of undefined
    (anonymous function) @ ldap_client.js:45
    (anonymous function) @ typ_accounts-ldap.js?0ad074ecfc292bededc7d318da4746392aa0f5f8:94
    (anonymous function) @ typ_accounts-ldap.js?0ad074ecfc292bededc7d318da4746392aa0f5f8:101

第45行是Template.signin.events({,所以我得出结论:Template没有一个名为signin的成员。我在几个地方看到了Template.signin.events({...})代码(只需用引号google "Template.signin.events"),但我猜他们在Meteor更新时将这些内容删除了?

我尝试过另一个版本:

Template.loginButtons.events({
    'submit #login-form': function(event, template){
        ...blah blah blah...

但是,*喘气* 这也不起作用。它并没有像原始代码一样给我 Uncaught TypeError,但我猜它只是未能覆盖正确的处理程序。

为了明确,这是我自己定制包内运行的所有客户端代码。我的 JS 文件是我在 Telescope 中定制包的直接子级。

如何覆盖 Meteor 中的默认登录处理程序?(即,如何使点击“登录”按钮时运行我的代码而不是 Meteor 的代码?)


更新:

应要求,我尝试了这个简短的演示文稿中介绍的“扩展 Meteor 账户”的步骤。我在客户端控制台上得到了很多错误信息,并在服务器端控制台上得到了一个错误信息。我感觉这是因为该建议与 Telescope 不兼容,但也许如果我有一个普通的 Meteor 实例,它会起作用。


也许这篇文章可以帮到你? - David Weldon
在我的广泛搜索中,我确实看到了那篇文章。我考虑了他们的观点,但我没有选择那条路线,因为我认为:“我不认为那会与Telescope的功能相匹配。”但也许它会。我现在正在尝试。 - Carter Pape
我更新了帖子以反映David推荐的帖子对我的结果产生了影响。 - Carter Pape
Template.XXX.events 是指要捕获事件的模板名称。您的登录模板的名称是什么?例如: <template name="Login"><form id="loginForm">...登录表单...</form></template>。您可以这样做:Template.Login.events({'submit #loginForm':function(event,template){...your code here...}}); - Michael Mason
1个回答

4
实现这个的正确方法是按照Telescope在他们自己的项目中所做的方式进行操作:
首先,将Telescope克隆到您的packages目录中,以便您可以自定义它。请注意,Telescope完全由packages组成。这些是构成应用程序的核心Telescope模块。我认为您只需要编辑以下两个模块:telescope-coretelescope-users
telescope-core中,登录视图的配置定义在packages/telescope-core/lib/config.js中。我会在这里添加/删除任何字段,并且您还可以覆盖模板以及重定向。
telescope-users中,您可能最感兴趣的是packages/telescope-users/lib/callbacks.js。这就是您要放置放入事件处理程序的代码的位置。
请注意,Telescope使用他们自己的自定义库来处理回调,您也必须使用它。幸运的是,它非常简单。您只需使用Telescope.callbacks.add(hook,callback)添加回调,并使用Telescope.callbacks.remove(hook,callback)删除它们。还可以在Telescope.runAsync中使用异步版本的Telescope.add
您首先需要浏览现有的回调并摆脱默认创建帐户的任何内容。您最有可能要查找的特定钩子是onCreateUser。因此,只需在他们的github上搜索Telescope.callbacks.add('onCreateUser',..即可。您还需要对其同一文件中定义的集合钩子执行相同操作,并根据需要替换这些钩子。
希望这能帮到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接