【发布时间】:2018-05-27 05:35:01
【问题描述】:
我正在使用 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);
});
}
});
});
直到一切都按预期发生之前,我收集了加载了客户端角色的字符串,不久之后我创建了一个连接角色函数来验证这一切。
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 的回调。
我的测试环境仅限于这种类型的测试,所以我希望你能在这个 xD 上帮助我
【问题讨论】:
-
您不能将
app.set()用于仅与一位用户相关的数据。该数据将在服务器范围内可用。相反,您需要将数据放入用户会话对象中,或者仅出于此特定请求的目的,然后将其放入req对象中。 -
type 如果我在用户的令牌旁边设置一个随机名称以避免这种数据覆盖,我是否有一个令牌?
-
抱歉,我不知道最后一条评论是什么意思。您应该将会话管理器和会话对象用于持久的用户特定数据。这是常见的最佳做法。
-
Yesss 登录后我使用
res.cookie('access_token', token.id, { signed: true , maxAge: 300000 });保持会话 -
那是一个 cookie。这不是会话管理器,也不会创建会话对象。
标签: javascript express acl loopback