Перезапись обработчика входа в систему Meteor по умолчанию

Я использую NPM ldapjs и этот Проект Meteor LDAP, чтобы попытаться включить LDAP на моем тестовом веб-сайте Telescope. Основная проблема заключается в том, что я хочу, чтобы 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');
        });
    }
});

Как говорится в комментарии, команда журнала никогда не запускается (я знаю, потому что использую 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({...}) код в нескольких разных местах (просто погуглите "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, это сработало бы.


person Carter Pape    schedule 17.07.2015    source источник
comment
Может быть, этот пост поможет?   -  person David Weldon    schedule 17.07.2015
comment
В своем e-x-t-e-n-s-i-v-e гуглении я действительно наткнулся на этот пост. Я обдумывал то, что они хотели сказать, но не пошел по этому пути, потому что думал, я не думаю, что это будет соответствовать функциональности Telescope. Но, может быть, так и было бы. Я пытаюсь сейчас.   -  person Carter Pape    schedule 17.07.2015
comment
Я обновил пост, чтобы отразить, как пост, рекомендованный Дэвидом, повлиял на мой результат.   -  person Carter Pape    schedule 24.07.2015
comment
Template.XXX.events относится к имени шаблона, для которого вы хотите записывать события. Как называется ваш шаблон входа? например для <template name="Login"><form id="loginForm">...login form...</form></template>. Вы бы сделали Template.Login.events({'submit #loginForm': function (event, template) { ...your code here... });   -  person Michael Mason    schedule 25.07.2015


Ответы (1)


Правильный способ добиться этого — сделать это так же, как Telescope делает это в своем собственном проекте:

Во-первых, клонируйте telescope в каталог пакетов, чтобы вы могли настроить его. Обратите внимание, что Telescope полностью состоит из пакетов. Это основные модули Telescope, из которых состоит приложение. Я считаю, что вам нужно отредактировать только следующие 2 модуля: telescope-core и telescope-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.add доступны по адресу Telescope.runAsync.

Сначала вы захотите просмотреть существующие обратные вызовы и избавиться от всего, что создает учетную запись по умолчанию. Конкретный крючок, который вы захотите найти, скорее всего, onCreateUser. Так что просто поищите на их гитхабе Telescope.callbacks.add('onCreateUser',... Вы захотите сделать то же самое с их обработчиками коллекций, которые также определены в том же файле, и замените их по своему усмотрению.

Надеюсь это поможет.

person Cooper Maruyama    schedule 25.07.2015