Модель клиента, основанная на пользователе, возвращает свойство FK на основе идентификатора пользователя вместо идентификатора клиента.

связанные с этим: предыдущая проблема

Я определил эту модель:

var customer = mongoDev.createModel('customer',
{
    id: {
        type: String,
        id: true
    },
    firstName: String,
    lastName: String,
    badge: String,
    email: String
},
{
    strict: true,
    base: "User"
});

Если я ничего не делаю, я получаю все ожидаемые дополнительные пользовательские конечные точки (вход в систему, выход из системы, accessTokens и т. д.). Однако мой результат входа в систему дает мне:

{
  "id": "ssOzK8EswH...",
  "ttl": 1209600,
  "created": "...",
  "userId": "53c6f5d4769ed..."
}

Похоже, что userId должен быть идентификатором клиента. Я удалил модели пользователей и accessToken из models.json. Так что я даже не знаю, откуда берется информация об отношениях, если только она не запечена где-то. В любом случае, если я попытаюсь позвонить /customer/53c6f5d4769ed... и указать токен в заголовке, я получу 401. Технически идентификатор правильный, просто неправильное имя FK.

Я пробовал такие вещи, как

var accessToken = mongoDev.createModel('accessToken',{},{base: "AccessToken"});
accessToken.belongsTo(customer, {as: 'customer', foreignKey: 'customerId'});

Я думаю, что это изменило имя FK для меня, но я все еще получаю 401 при вызове последующих конечных точек.

Вот я и добрался до себя. Итак, мой вопрос на самом деле таков:

Используя сначала код, а не модель «пользователь» для моей аутентификации, как мне подключить accessToken (также сначала код)? И поворот был бы в том, что я бы планировал иметь несколько моделей аутентификации (т.е. клиент, поставщик, сотрудник). Итак, реальный вопрос заключается в том, как мне связать это, чтобы позволить каждому типу «пользователя» получить свои собственные токены доступа ???

Чисто как грязь?? ;-)


person huxley    schedule 16.07.2014    source источник


Ответы (2)


LoopBack поставляет базовые модели User и AccessToken. Их можно расширить, чтобы настроить поведение, как показано в файле models.json. Затем на модели можно ссылаться как на app.models.user и app.models.accessToken. UserId — это внешний ключ от токена доступа к пользовательской модели, и его можно переименовать в «customerId».

Для принудительного применения ACL с использованием роли «$owner» экземпляр модели должен иметь свойство «owner» или «userId» или отношение «belongsTo» к подклассу пользовательской модели.

Я предлагаю вам разделить вопросы на более мелкие. Не стесняйтесь размещать сообщения на https://groups.google.com/forum/#!forum/loopbackjs.

person Raymond Feng    schedule 17.07.2014

Так что я даже не знаю, откуда берется информация об отношениях, если только она не запечена где-то.

Информация об отношениях включена в модель User. Поскольку ваш customer расширяет User, он также унаследует отношения.

Я пробовал такие вещи, как

var accessToken = mongoDev.createModel('accessToken',{},{base: "AccessToken"}); accessToken.belongsTo(клиент, {как: 'клиент', ForeignKey: 'customerId'});

AFAIK внешний ключ должен быть userId независимо от имени вашей пользовательской модели.

var accessToken = mongoDev.createModel('accessToken',{},{base: "AccessToken"});
accessToken.belongsTo(customer, {as: 'user', foreignKey: 'userId'});

Когда я попытался написать пример приложения, чтобы воспроизвести проблему, приложение отлично разветвлялось (протестировано с использованием соединителей memory и mongodb).

var loopback = require('loopback');

var customer = loopback.createModel('customer',
{
    id: { type: String, id: true },
    firstName: String,
    lastName: String,
    badge: String,
    email: String
},
{
    strict: true,
    base: "User"
});

var app = loopback();

app.dataSource('db', {
 connector: 'mongodb' // or memory
});

app.model(loopback.AccessToken, { dataSource: 'db' });
app.model(customer, { dataSource: 'db' });

app.use('/api', loopback.rest());
app.use('/explorer', require('loopback-explorer')(app));
app.listen(3000, function() {
  console.log('Explore at http://localhost:3000/explorer');
});

Версии модуля:

[email protected]
[email protected]
[email protected]

Используя сначала код, а не модель «пользователь» для моей аутентификации, как мне подключить accessToken (также сначала код)?

См. пример выше.

И поворот был бы в том, что я бы планировал иметь несколько моделей аутентификации (т.е. клиент, поставщик, сотрудник). Итак, реальный вопрос заключается в том, как мне связать это, чтобы позволить каждому типу «пользователя» получить свои собственные токены доступа ???

Я не думаю, что LoopBack поддерживает это сейчас, пожалуйста, откройте проблему github с запросом такой функции.

person Miroslav Bajtoš    schedule 23.07.2014