这是一个最佳实践'题。 (为清晰起见更新)
我正在尝试找到使浏览器端代码适应用户属性的最佳方法,例如用户是否经过身份验证,管理员或具有某些属性。
我正在创建一个静态应用程序。出于某些正当理由,我无法获得服务器呈现的页面。他们需要是静态的;每个人都可以使用相同的页面;因此,服务器呈现页面的解决方案是不可行的(请将此视为此问题)。
此应用程序的所有安全性都是服务器端的。所有提供的页面和路由都通过快递和护照进行访问管理,从浏览器发送的cookie验证身份验证,并在身份验证失败时重定向到/ login。所以这并不是要将安全性移到浏览器端;我非常在实现安全服务器端;这是关于如何向用户呈现状态。
我正在使用快速会话将会话ID存储在cookie中。默认情况下,它只会将会话ID放在cookie中,并将其标记为httpOnly,因此我无法从浏览器代码中访问它。
我修改了express-session的配置以关闭httpOnly,所以我现在可以通过javascript在浏览器上看到cookie,但它仍然只是会话ID。
我希望能够做的是将附加的特定信息附加到会话cookie,以便我的页面可以根据此信息决定显示/隐藏的内容。
所以问题归结为:
如何获得express / passport以传递具有其他特定用户属性的会话cookie,以及如何在客户端上阅读它?
答案 0 :(得分:0)
您提到您使用护照进行身份验证,因此这将是我提出的解决方案的起点。
请记住,如果在尝试连接到我们的数据库时发生异常,我们会调用done(错误),否则如果找不到用户或密码不匹配,我们将调用done(null,false)。如果成功,我们调用done(null,user)。这会将用户对象附加到express( req.user )的请求对象。
现在我们已经解决了这个问题,这就是我们如何为用户提供用户对象属性:
app.get('/',function(req, res) {
res.render('index', {
// Ternary operator which checks if the user object is empty or not
username: req.user ? req.user.username: '',
title: 'Tutorial'
})
);
然后我显示'用户名',如果用户登录,则用户名不会为空,否则我会显示该表单:
<%if( !username ) {%>
<ul>
<li><a href="/signup">Signup</a></li>
<li><a href="/signin">Signin</a></li>
</ul>
<%} else {%>
<a href="#"><p><%= username %></p></a>
<form method="post" action="/posts">
<input type="text" name="title"><br/>
<textarea name="content"></textarea><br/>
<input type="submit" value="Post">
</form>
<%}%>
您也可以使用&#39; role&#39;等属性执行相同操作。为您的用户,并在您的视图文件中检查该角色是否为管理员。我不太确定这是否能回答你的问题,希望有所帮助。
答案 1 :(得分:0)
@ robertklep的建议最终成为我实施的目标。
由于express-session故意只将会话ID放在会话cookie中,并且看起来是不可更改的,我唯一的做法就是使用res.cookie()在响应中放置一个额外的cookie,然后我读了在我的客户端应用程序中,无论何时需要。