繁体   English   中英

如何让Foxx服务使用基本集合而不是特定于挂载的集合

[英]How to have a Foxx service use base collection instead of mount specific ones

我如何让Foxx服务将基本集合用于身份验证操作? 例如,我希望https://docs.arangodb.com/3.3/Manual/Foxx/Users.html上的用户管理教程使用集合“用户”和“会话”,而不是“ test_users”和“ test_sessions”,其中“测试”是我的挂载点的名称。

我想运行所有服务都基于相同的基本集合。 但是,如果我按照教程中给出的内容进行操作,那么我最终会获得针对服务的auth集合和路由,这对男性来说并没有太大意义。

我的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错误。

要实现这一点,您需要在所有文件'nameOfCollection'集合名称的分配从module.context.collectionName('nameOfCollection')更改为'nameOfCollection' ,因为module.context.collectionName为服务名称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'
});

但是,对于更多服务需要访问相同基础集合的情况(例如,一项服务的拆除可能会删除其他服务的那些集合),这种方法是一种反模式。

在这种情况下,您应该利用依赖关系 ,只有您的auth服务应该有权访问其自己的集合,而其他服务应该具有auth服务作为依赖关系,并通过auth服务访问auth数据。

身份验证服务需要

在manifest.json中

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

在index.js或您在manifest.json中指向main文件的文件中

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);
}

有关请求授权的进一步步骤,请检查如何使用中间件会话中间件

上帝的速度

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM