sails.config.session
Sails 内置会话支持的配置。
Sails 的默认会话集成很大程度上依赖于 Express 和 Connect 已经完成的优秀工作,但也添加了一些自己的特殊功能,通过挂接到请求解释器中。这使得 Sails 能够访问和自动保存您的代码在处理来自 Socket.IO 的虚拟请求时对 req.session
进行的任何更改。最重要的是,这意味着您可以像以前使用 Express 或 Connect 一样编写使用 req.session
的代码,无论您的控制器操作是设计用于处理 HTTP 请求、WebSocket 消息还是两者兼而有之。
属性 | 类型 | 默认值 | 详情 |
---|---|---|---|
adapter |
undefined |
如果未指定,Sails 将使用底层会话中间件中捆绑的默认内存存储。这对于开发来说很好,但在生产环境中,您必须传入已安装的可扩展会话存储模块的名称(例如 @sailshq/connect-redis )。有关详细信息,请参见下面的生产配置。 |
|
name |
sails.sid |
启用会话时(默认情况下 Sails 应用程序已启用)在响应中设置(并在请求中读取)的会话 ID Cookie 的名称。如果您从同一个共享 Cookie 命名空间(即顶级 DNS 域名,如 frog-enthusiasts.net )运行多个不同的 Sails 应用程序,则必须格外小心地为每个单独的应用程序配置单独的唯一密钥,否则可能会使用错误的 Cookie。 |
|
secret |
n/a | 此会话密钥在创建新应用程序时会自动生成。在生产环境中更改此密钥时应格外小心,因为这样做会使用户的会话 Cookie 无效,迫使他们重新登录。请注意,这也被用作签名 Cookie 的“Cookie 密钥”。 | |
cookie |
参见下面 | 会话 ID Cookie 的配置,包括 maxAge 、secure 等。有关更多信息,请参见下面。 |
|
isSessionDisabled |
(参见详情) | 一个将在每个请求中运行的函数,如果它返回一个“真值”,则会导致请求禁用会话支持(即 req.session 将不存在)。默认情况下,此函数将检查请求路径与sails.LOOKS_LIKE_ASSET_RX 正则表达式,有效地禁用请求资产时的会话支持。 |
如果您在开发中使用 Redis 作为会话存储,则可以使用其他配置选项。大多数应用程序可以使用 Sails 默认的 Redis 支持,如此处所述,但某些高级用例可能包括以下可选配置
属性 | 类型 | 默认值 | 详情 |
---|---|---|---|
url |
undefined |
要连接到的 Redis 实例的 URL。这可能包括以下一个或多个设置,例如 redis://:[email protected]:1234/5 表示 host 为 myredishost.com 、port 为 1234 、pass 为 mypass 以及 db 为 5 。通常,您应该使用 url 或以下设置的组合,以避免混淆。 |
|
host |
'127.0.0.1' |
Redis 实例的主机名。如果配置了 url 设置,则会忽略此设置。 |
|
port |
6379 |
Redis 实例的端口。如果配置了 url 设置,则会忽略此设置。 |
|
pass |
undefined |
Redis 实例的密码。如果您未使用密码,请留空。如果配置了包含密码的 url 设置,则此设置将覆盖 url 中的密码。 |
|
db |
undefined |
在 Redis 实例中使用的数据库索引。如果指定,则必须是整数。(在典型的 Redis 设置中,这将是 0 到 15 之间的数字。)如果配置了包含 db 的 url 设置,则此设置将覆盖 url 中的 db。 |
|
client |
undefined |
要使用的已连接 Redis 客户端。如果提供,则会忽略任何 url 、host 和 port 设置。如果您有 Redis Sentinel 设置并需要使用像ioredis 这样的模块进行连接,则此设置很有用。 |
|
onRedisDisconnect |
undefined |
如果 Redis 连接断开,Sails 可以调用的可选函数。对于将您的站点置于临时维护模式或“紧急模式”很有用(请参见sails-hook-panic-mode以获取示例)。 | |
onRedisReconnect |
undefined |
如果先前断开的 Redis 连接已恢复,Sails 可以调用的可选函数(请参见上面的 onDisconnect )。 |
|
handleConstructingSessionStore |
undefined |
Sails 可以调用的可选覆盖函数,而不是标准会话存储构建行为。要使用此设置,请首先阅读并理解相关源代码。 |
注意:
onRedisDisconnect
和onRedisReconnect
仅适用于 Sails 为您创建的 Redis 客户端;如果您提供自己的 Redis 客户端(请参见上面的client
选项),则在断开连接或重新连接的情况下,不会自动调用这些函数。
只要您使用兼容版本,任何为 Connect/Express 编写的会话适配器都可以在 Sails 中使用。
Sails.js 推荐的生产会话存储是 Redis……但我们意识到,对于某些应用程序来说,这并非可行。幸运的是,Sails.js 支持几乎任何与 Connect/Express 兼容的会话存储——这意味着您几乎可以在任何地方存储您的会话,无论是 Mongo、本地文件系统,甚至关系数据库。查看 Sails.js、Express 和 Connect 的社区会话存储在 NPM 上可用。
Sails 中内置的会话集成通过使用会话 ID Cookie 来工作。此 Cookie 是HTTP 仅(作为防止XSS 漏洞的安全措施),并且默认情况下,使用名称“sails.sid”设置。
默认情况下,Cookie 对同站点攻击者没有完整性。
在生产环境中,我们建议您在 Cookie 的“名称”(sails.config.session.name
)前加上“__Host-” 以将 Cookie 的范围限制到单个来源。
您可以此处阅读有关“__Host-” 前缀的更多信息。
session: {
name: '__Host-sails.sid'
}
注意:添加此前缀需要将“安全”标志设置为
true
。
应用程序的会话 ID Cookie 的最大年龄/过期时间可以设置为毫秒数。
例如,要在 24 小时后注销用户
session: {
cookie: {
maxAge: 24 * 60 * 60 * 1000
}
}
否则,默认情况下,此选项设置为 null
,这意味着会话 ID Cookie 不会发送任何类型的“过期”或“最大年龄”标头,并且仅在用户打开 Web 浏览器时持续存在。
是否在会话 ID Cookie 上设置“安全”标志。
session: {
cookie: {
secure: true
}
}
在开发过程中,当您未使用 HTTPS 时,应将 sails.config.session.cookie.secure
保留为未定义(默认值)。
但在生产环境中,您需要将其设置为 true
。这指示 Web 浏览器,它们应该拒绝发送回会话 ID Cookie,除非通过安全协议(https://
)。
注意:如果您在代理/负载均衡器后面使用 HTTPS(例如,在 Heroku 等 PaaS 上),那么您仍然应该设置
secure: true
。但是请注意,为了使会话与启用的secure
一起工作,您还需要设置另一个名为sails.config.http.trustProxy
的选项。
在生产环境中?是的。
如果您依赖 Sails 的内置会话集成,请始终在生产环境中使用 SSL 证书。否则,会话 ID Cookie(或任何其他安全数据)可能会以明文形式传输,这将使咖啡店中的攻击者能够窃听您已认证用户的 HTTP 请求之一,拦截他们的会话 ID Cookie,然后伪装成他们来造成破坏。
还要意识到,即使您拥有 SSL 证书,并且始终将 http://
重定向到 https://
,对于所有子域,设置 secure: true
仍然很重要。(因为如果没有它,即使您立即重定向所有 HTTP 流量,第一个请求仍然是通过 http://
进行的,因此会以明文形式传输会话 ID Cookie。)
要查看其他可用选项(如“域”)以在 Sails 中配置会话 ID Cookie,请参见express-session#cookie。
Sails 中默认启用会话。要禁用应用程序中的会话,请通过更改您的 .sailsrc
文件禁用 session
挂钩。禁用 session
的过程与禁用 Grunt 挂钩的过程相同(只需键入 session: false
而不是 grunt: false
)。
注意:如果禁用了会话挂钩,则配置为
sails.config.session.secret
的会话密钥仍将用于支持签名 Cookie(如果相关)。如果禁用了会话挂钩并且您的应用程序不存在会话密钥配置(例如,因为您删除了config/session.js
),则您的应用程序将无法使用签名 Cookie。要对此行为进行更高级的更改,您可以使用sails.config.http
手动自定义应用程序的任何 HTTP 中间件。