Как заставить сервис Foxx использовать базовую коллекцию вместо монтирования определенных - PullRequest
0 голосов
/ 21 октября 2018

Как сделать так, чтобы сервис Foxx использовал базовые коллекции для операций аутентификации?Например, я хочу, чтобы в руководстве по управлению пользователями на https://docs.arangodb.com/3.3/Manual/Foxx/Users.html использовались коллекции "users" и "session" вместо "test_users" и "test_sessions", где "test" - это имя моей точки монтирования.

Я хочу запустить несколько сервисов, работающих с одинаковыми базовыми коллекциями.Но если я пойду с тем, что приведено в руководствах, я получу коллекции аутентификации и маршруты, специфичные для службы, которая не имеет для меня особого смысла.

Мой setup.js - это;

'use strict';
const db = require('@arangodb').db;
const sessions = module.context.collectionName('sessions');
const users = module.context.collectionName('users');

if (!db._collection(sessions)) {
  db._createDocumentCollection(sessions);
}

if (!db._collection(users)) {
  db._createDocumentCollection(users);
}

db._collection(users).ensureIndex({
  type: 'hash',
  fields: ['username'],
  unique: true
});

, и мой index.js:

'use strict';

const joi = require('joi');
const createAuth = require('@arangodb/foxx/auth');
const createRouter = require('@arangodb/foxx/router');
const sessionsMiddleware = require('@arangodb/foxx/sessions');
// const db = require('@arangodb').db;

const auth = createAuth();
const router = createRouter();
const users = db._collection('users');
const sessions = sessionsMiddleware({
storage: module.context.collection('sessions'),
transport: 'cookie'
});

module.context.use(sessions);
module.context.use(router);

// continued
router.post('/signup', function (req, res) {
    const user = {};
    try {
      user.authData = auth.create(req.body.password);
      user.username = req.body.username;
      user.perms = [];
      const meta = users.save(user);
      Object.assign(user, meta);
    } catch (e) {
      // Failed to save the user
      // We'll assume the uniqueness constraint has been violated
      res.throw('bad request', 'Username already taken', e);
    }
    req.session.uid = user._key;
    req.sessionStorage.save(req.session);
    res.send({success: true});
  })
  .body(joi.object({
    username: joi.string().required(),
    password: joi.string().required()
  }).required(), 'Credentials')
  .description('Creates a new user and logs them in.');

Я попытался использовать const users = db._collection('users'); вместо const users = module.context.collection('users');, но это выдает ошибки API swagger.

1 Ответ

0 голосов
/ 21 октября 2018

, чтобы достичь этого, вам нужно изменить присвоение имен коллекций со module.context.collectionName('nameOfCollection') на 'nameOfCollection' во всех файлах, потому что module.context.collectionName префиксирует строку с именем службы

, поэтому

setup.js

const sessions = 'sessions';
const users = 'users';

index.js

const users = db._collection('users');
const sessions = sessionsMiddleware({
    storage: 'sessions',
    transport: 'cookie'
});

однако этот подход является антипаттерном для случая, когда большему количеству сервисов необходим доступ к одним и тем же базовым коллекциям (например, удаление одного сервиса может удалитьэти коллекции для других услуг).

для этого случая вы должны использовать зависимости , только ваша служба аутентификации должна иметь доступ к своим собственным коллекциям, а другие службы должны иметь службу аутентификации как зависимость и доступ к данным аутентификации через службу аутентификации.

Служба аутентификации должна иметь

в manifest.json

"provides": {
    "myauth": "1.0.0"
}

в index.js или какой файл вы указываете как main в manifest.json

module.exports = {
    isAuthorized (id) {
        return false; // your code for validating if user is authorized
    }
};

потребляющий сервис должен иметь

в manifest.json

"dependencies": {
    "myauth": {
        "name": "myauth",
        "version": "^1.0.0",
        "description": "Auth service.",
        "required": true
    }
}

, а затем вы можете зарегистрировать его и назвать его

const myauth = module.context.dependencies.myauth;
if (myauth.isAuthorized()) {
    // your code
} else {
    res.throw(401);
}

для дальнейших действийУсловия авторизации запросов проверьте, как использовать Middleware и Session middleware

God Speed ​​

...