我在用 :
对于每个用户,我将其Google个人资料中的一些信息(电子邮件等…)存储在MySQL数据库中(我对此技术没有选择),访问和刷新令牌以及用户在提供信息时提供的其他信息他在我的应用上注册。
我已经看到了password.js的不同用法,特别是关于该信息在会话中的存储方式。
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
基本上,每次用户发出请求或访问页面时,都会向数据库发送请求,并检索信息。有什么意义呢?这会大大降低应用程序的速度。serializeUser
调用时(即,当信息存储在会话中时)是否不应该从数据库中检索信息?
我已经读到,在其中存储 太多 信息session
会使应用程序变慢。什么是“太多”?应用程式会减慢多少?有人知道某处是否有测试吗?我的应用程序页面需要有关用户的另一组数据(例如,主页只需要其姓名,而个人资料页面将需要所有内容,另一个页面将需要知道他拥有哪些汽车等)。我应该存储在所有这些信息session
时passport.authenticate
,如果用户在DB(从而限制读取请求的DB到大约一)存在的检查,或仅在会话他的ID存储,并有我的网页做必要时其它附加请求到DB?
我遇到的另一个问题:在注册过程中,我首先让用户登录他的Google帐户,将他的个人资料的详细信息存储在 某个地方 ,请他填写其他信息的表格,然后将所有内容插入数据库。问题是,在将Google帐户详细信息插入数据库之前,我不知道如何正确存储它们。目前,我将它们存储在中session
,然后在插入成功后将其删除。更具体地说,当在数据库中找不到现有用户时,在passport.authenticate
回调中执行以下操作:
return done(null,false,userInfo);
因此,该用户未通过身份验证,并且有两个问题:我必须将其存储在userInfo
某个位置,直到该用户注册为止,并且必须req.login()
在注册完成后使用“手动”方式登录他。
我应该在他登录自己的Google帐户后立即对其进行身份验证吗?如果他不完成注册,那会不会对我造成安全问题?
非常感谢你 !
1)serializeUser正在过滤数据并将其存储在会话cookie中。如果可以的话,通常在Cookie中的存储量较少。无论如何,您都将调用db来获取有关用户的数据,因此您可以仅存储用于检索和重建用户的ID,如在deserializeUser中所示。
客户端将cookie中的请求提供给服务器,服务器将cookie反序列化为数据,解密cookie内容或从数据库中检索用户数据。然后,响应返回到服务器,对客户端数据进行序列化,清除您不会存储在cookie中的内容,并将其放入db中,仅在cookie中保留一个ID。
如果您要进行加密,则可以通过运行多台需要解密数据的机器来扩展规模,这很容易搞砸(不是很困难,但是不必要的复杂性)
最好仅在cookie中放置未加密的数据,并且cookie中的任何内容都可以为用户增加额外的带宽使用量。
2)数据库调用应该非常快,如果不是这样,无论如何,您将在其他地方遇到痛苦的用户体验。换句话说,我的强烈观点是,有一个压倒一切的观点是远离cookie。
考虑到cookie是随每个请求一起发送的;这样会更明智,而不是将数据推送到会话中并使其增加开销,而是在用户发出请求后暂时将用户数据加载(缓存)一会儿,然后既没有数据库调用也没有cookie的开销当用户积极访问您的网站时。
老实说,您一开始应该没有缓存就可以。专注于以最小的复杂度启动您的应用程序。这样,您可以根据用户反馈更快地对其进行修改,并且错误更少。
3)当我玩护照时,我遇到了类似的问题。我会让护照完成其工作,并向用户授予护照级别的验证(是的,他们已经登录),然后分别进行更多的数据收集。如果您担心安全性,请确保此护照级别的验证未完全登录,并且在升级到完全登录之前需要更多数据。
我可能对此一无所知,但这是我的建议。
4)Redis适用于您有多个节点实例并想在内存中存储某些内容(例如计数器或缓存的用户数据)的情况。这样,您就不会在节点代码中保留用于保存有关用户的缓存数据的变量,而当用户回来时,另一个节点实例将无法利用该变量,而负载均衡器会将它们射向另一个实例。
http://www.ourdailycodes.com/2013/09/redis-when-should-i-use-
it.html
编辑:我应该添加该会话使用cookie,但只能为用户提供服务器可以理解的唯一令牌,以便在接收到带有会话令牌的连接时服务器可以重新收集用户的会话数据。我的理解是,这通常是Session工作的正确方式…但是,具体取决于实现方式(如果我在这里错了,请纠正我)。
问题内容: 我只想检索UserAccount类中的某些列,所以我有以下代码: 我得到了空值作为回报。但是,如果我注释掉setProjections,我将获得具有所有属性的用户。在这种情况下,如何正确使用setProjection? 问题答案: 它返回一个Object数组,因此代码应为:
问题内容: 我不知道我在哪里错了:/。当我运行这段代码时,我得到的只是一个空白元素。我似乎无法让insertRule方法执行任何操作(甚至不会产生错误)。我想念什么吗? 问题答案: 这有点令人困惑,但是您的代码确实可以工作,只是您看不到返回的XML树中插入的规则。 为了验证您的代码是否有效,您可以执行两个测试: 运行上面的代码片段,您可以看到CSS规则确实适用。并且属性也在控制台中更改。 当浏览器
问题内容: 如何使用从类路径中查找递归资源? 例如 在“目录”中查找所有资源:想象一下 不幸的是,这只会检索到恰好该“目录”。 所有资源都已命名(递归) 但这返回一个空。 还有一个额外的问题:与有什么不同? 问题答案: 没有办法递归搜索类路径。您需要知道资源的完整路径名才能以这种方式检索它。该资源可能位于文件系统中的目录中,也可能位于jar文件中,因此它不像执行“类路径”的目录列表那样简单。您将需
问题内容: 我最近开始使用ScriptManager。我有一个通过JavaScript填充的ASP.NET DropDownList控件。但是,我正在使用事件验证。因此,如果我不使用下拉菜单中的“ RegisterForEventValidation”调用,则会遇到以下错误。我怎么知道在第二个参数中设置什么值(我有“值”)?我正在通过JavaScript填充下拉列表,因此我不知道后面的代码中包含哪
我正在尝试正确地使用ByteBuffer和BigEndian字节顺序格式。。 我有几个字段,我试图把它存储在Cassandra数据库之前放在一个单一的ByteBuffer中。 我将要写入Cassandra的字节数组由三个字节数组组成,如下所述- 现在,我将写,和一起到一个字节数组和由此产生的字节数组我将写入Cassandra,然后我将有我的C程序来检索它字节数组数据从Cassandra,然后反序列
我有一个分辨率为2560x1920的图像。我正在对它应用精明的操作符。但是我得到的结果不适合我。我希望所有的边缘都突出来。然而,当我将此算法应用于较低分辨率的图像时,一切都正常工作。我怎样才能解决问题?