我正在使用connect-roles和loopback释放对网页的访问权限,但我有一个相关的问题,即我如何收集客户的角色,并通过连接角色来阅读会话并回复路线
示例,当客户端登录时,我加载一个包含客户端角色的字符串,并在控制页面访问权限的函数中访问它。
我有这个疑问,因为我正在最终确定一项大型服务,通常会有多个客户端会话,使用相同的存储和检查功能即可立即访问。
使用app.set()
和app.get()
存储客户的角色会很有效吗?
app.get('/session-details', function (req, res) {
var AccessToken = app.models.AccessToken;
AccessToken.findForRequest(req, {}, function (aux, accesstoken) {
// console.log(aux, accesstoken);
if (accesstoken == undefined) {
res.status(401);
res.send({
'Error': 'Unauthorized',
'Message': 'You need to be authenticated to access this endpoint'
});
} else {
var UserModel = app.models.user;
UserModel.findById(accesstoken.userId, function (err, user) {
// console.log(user);
res.status(200);
res.json(user);
// storage employee role
app.set('employeeRole', user.accessLevel);
});
}
});
});
直到那一刻,一切都按照需要发生我收集加载了客户角色的字符串,并在我创建一个connect-roles函数来验证所有这些后不久。
var dsConfig = require('../datasources.json');
var path = require('path');
module.exports = function (app) {
var User = app.models.user;
var ConnectRoles = require('connect-roles');
const employeeFunction = 'Developer';
var user = new ConnectRoles({
failureHandler: function (req, res, action) {
// optional function to customise code that runs when
// user fails authorisation
var accept = req.headers.accept || '';
res.status(403);
if (~accept.indexOf('ejs')) {
res.send('Access Denied - You don\'t have permission to: ' + action);
} else {
res.render('access-denied', {action: action});
// here
console.log(app.get('employeeRole'));
}
}
});
user.use('authorize access private page', function (req) {
if (employeeFunction === 'Manager') {
return true;
}
});
app.get('/private/page', user.can('authorize access private page'), function (req, res) {
res.render('channel-new');
});
app.use(user.middleware());
};
特别注意这一刻,当我使用的时候
console.log(app.get('employeeRole'));
我不会遇到同时连接的问题吗?
app.get('/private/page', user.can('authorize access private page'), function (req, res) {
res.render('channel-new');
});
示例客户端x和y同时连接并使用相同的功能存储有关会话的数据?
当我在console.log(app.get('employeeRole'));
打印字符串时更具体,如果我的疑问是正确的,我对同时连接没有问题我将加载一个新变量var employeeFunction = app.get('employeeRole');
所以我的函数可以使用该对象包含我的客户端在if (employeeFunction === 'Any Role')
中的角色,如果字符串中加载的角色包含所需的角色,则路由会释放页面,否则它将使用failureHandler
的回调。
我的测试环境仅限于此类测试,所以我希望你能帮我解决这个问题
答案 0 :(得分:0)
您可以创建会话映射(如散列图),而不是使用app.set。我已经在我的一个项目中集成了它,并且它运行完美。以下是它的代码以及如何访问它:
<强> hashmap.js 强>
var hashmapSession = {};
exports.auth = auth = {
set : function(key, value){
hashmapSession[key] = value;
},
get : function(key){
return hashmapSession[key];
},
delete : function(key){
delete hashmapSession[key];
},
all : function(){
return hashmapSession;
}
};
<强> app.js 强>
var hashmap = require('./hashmap');
var testObj = { id : 1, name : "john doe" };
hashmap.auth.set('employeeRole', testObj);
hashmap.auth.get('employeeRole');
hashmap.auth.all();
hashmap.auth.delete('employeeRole');