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 并使用它来获取与该用户相关的信息。

例如:

  1. 获取所有与登录用户 ID 匹配的评论
  2. 获取所有 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);
    });
});