[英]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.