EJS 页面渲染中访问用户数据的正确方式
The correct way of accessing user data within page rendering in EJS
我有一个应用程序,与大多数应用程序一样,用户注册并且他们的数据使用 Mongoose 保存在 MongoDB 中的用户文档中。
现在要知道的重要一点是,我正在使用 Node.js 并在每个路由中呈现我的页面,使用 EJS Tempting 引擎。
渲染页面示例:
app.get('/profile',isLoggedIn,function(req, res) {
res.render('profile.ejs', {
user: req.user
});
});
现在您可以在上面的代码中看到我正在检查用户是否已登录,然后将用户对象传递到我的模板。用户对象包含登录用户的整个用户文档。
我如何使用用户对象:
在前端,当用户访问他们的个人资料时,我使用 user: req.user
对象访问已签名的用户文档 ID
并使用它来获取与该用户相关的信息。
例如:
- 获取所有与登录用户 ID 匹配的评论
- 获取所有 post 匹配登录用户 ID
举个例子:
<body ng-init="getUserPosts('<%= user._id %>')"></body>
以上完美运行,我多次使用相同的技术,超时我需要用户 ID 来获取与该用户相关的数据或 post 到该用户帐户,例如:
<button ng-click="savePost('<%= user._id %>')">Send</button>
上面找到具有给定 ID 的用户(始终是登录用户)将 posts 保存到他们的帐户。
问题:
现在我的代码运行良好,我没有遇到任何问题,但我注意到,当我在任何浏览器中检查我的页面元素时,我可以清楚地看到用户 ID。下图有助于理解我的意思:
现在我明白了,只有登录用户才能查看自己的 ID。但这仍然是正确的方法吗?这有害吗?我该如何改进?
根据我的评论,一种方法是加密 user._id
值,然后将其发送给客户端。
app.get('/profile',isLoggedIn,function(req, res) {
var user = req.user;
user._id = encrypt(user._id);
res.render('profile.ejs', {
user: user
});
});
这意味着在 html 你得到
<button ng-click="savePost('someEncryptedValue')">Send</button>
您的原始 mongo ID 不再暴露给客户端。
在后端,您将首先解密该值,然后按照您的意愿继续操作。
app.get(/userPosts,function(req,res){
var userId = decrypt(req.query.id);
Posts.find({userId:userId},function(err,posts){
res.send(posts);
});
});
我有一个应用程序,与大多数应用程序一样,用户注册并且他们的数据使用 Mongoose 保存在 MongoDB 中的用户文档中。
现在要知道的重要一点是,我正在使用 Node.js 并在每个路由中呈现我的页面,使用 EJS Tempting 引擎。
渲染页面示例:
app.get('/profile',isLoggedIn,function(req, res) {
res.render('profile.ejs', {
user: req.user
});
});
现在您可以在上面的代码中看到我正在检查用户是否已登录,然后将用户对象传递到我的模板。用户对象包含登录用户的整个用户文档。
我如何使用用户对象:
在前端,当用户访问他们的个人资料时,我使用 user: req.user
对象访问已签名的用户文档 ID
并使用它来获取与该用户相关的信息。
例如:
- 获取所有与登录用户 ID 匹配的评论
- 获取所有 post 匹配登录用户 ID
举个例子:
<body ng-init="getUserPosts('<%= user._id %>')"></body>
以上完美运行,我多次使用相同的技术,超时我需要用户 ID 来获取与该用户相关的数据或 post 到该用户帐户,例如:
<button ng-click="savePost('<%= user._id %>')">Send</button>
上面找到具有给定 ID 的用户(始终是登录用户)将 posts 保存到他们的帐户。
问题:
现在我的代码运行良好,我没有遇到任何问题,但我注意到,当我在任何浏览器中检查我的页面元素时,我可以清楚地看到用户 ID。下图有助于理解我的意思:
现在我明白了,只有登录用户才能查看自己的 ID。但这仍然是正确的方法吗?这有害吗?我该如何改进?
根据我的评论,一种方法是加密 user._id
值,然后将其发送给客户端。
app.get('/profile',isLoggedIn,function(req, res) {
var user = req.user;
user._id = encrypt(user._id);
res.render('profile.ejs', {
user: user
});
});
这意味着在 html 你得到
<button ng-click="savePost('someEncryptedValue')">Send</button>
您的原始 mongo ID 不再暴露给客户端。
在后端,您将首先解密该值,然后按照您的意愿继续操作。
app.get(/userPosts,function(req,res){
var userId = decrypt(req.query.id);
Posts.find({userId:userId},function(err,posts){
res.send(posts);
});
});