如何添加“记得我”登录功能

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.4,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

如何添加“记得我”登录功能

一旦用户通过身份验证,他们的凭证通常存储在会话中。这意味着当会话结束时,他们将被注销,并且在下次希望访问应用程序时必须再次提供登录详细信息。的cookie可以允许用户选择在会话持续时间之后继续登录remember_me防火墙选项:

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15
#配置/包/ security.yaml安全:#……防火墙:主要:#……remember_me:秘密:“% kernel.secret %”生命周期:604800# 1秒内的一周路径:/#默认情况下,该特性是通过检查#复选框(见下文),取消注释#下面的行始终启用它。# always_remember_me:真

remember_meFirewall定义了以下配置选项:

秘密要求
用于加密cookie内容的值。常用的是秘密中定义的值APP_SECRET环境变量。
的名字(默认值:REMEMBERME
用于保持用户登录的cookie的名称。如果您启用remember_me在同一应用程序的多个防火墙中,请确保为每个防火墙选择不同的cookie名称。否则,您将面临许多与安全相关的问题。
一生(默认值:31536000
用户保持登录状态的秒数。缺省情况下,用户登录时间为一年。
路径(默认值:/
使用与此特性关联的cookie的路径。默认情况下,cookie将应用于整个网站,但您可以限制到特定的部分(例如。/论坛/管理).
(默认值:
使用与此特性关联的cookie的域。默认情况下,cookie使用从$ _SERVER
安全(默认值:
如果真正的,与此功能相关的cookie将通过HTTPS安全连接发送给用户。
httponly(默认值:真正的
如果真正的,与此特性关联的cookie只能通过HTTP协议访问。这意味着脚本语言(如JavaScript)无法访问cookie。
samesite(默认值:
如果设置为严格的,与此功能相关的cookie将不会随跨站点请求一起发送,即使是在遵循常规链接时。
remember_me_parameter(默认值:_remember_me
检查表单字段的名称,以决定是否应该启用“Remember Me”功能。请继续阅读本文,了解如何有条件地启用此功能。
always_remember_me(默认值:
如果真正的的值remember_me_parameter被忽略,“记住我”功能总是启用,而不管最终用户的愿望如何。
token_provider(默认值:
定义要使用的令牌提供程序的服务id。如果要在数据库中存储令牌,请参见如何添加“记得我”登录功能

强制用户选择退出“记住我”功能

为用户提供使用或不使用remember me功能的选项是个好主意,因为它并不总是合适的。通常的方法是在登录表单中添加一个复选框。通过给复选框命名_remember_me(或使用配置的名称)remember_me_parameter),当用户勾选复选框并成功登入时,便会自动设置该cookies。所以,你特定的登录表单最终可能是这样的:

1 2 3 4 5 6 7 8 9
{/安全/ login.html #模板。树枝#}<形式方法“职位”>{#……您的表单字段#}<输入类型“复选框”id“remember_me”的名字“_remember_me”检查/><标签“remember_me”>让我登录标签>{#……#}形式>

当cookie仍然有效时,用户将在后续访问时自动登录。

强制用户在访问某些资源前重新认证

当用户返回您的站点时,他们将根据存储在remember me cookie中的信息自动进行身份验证。这允许用户访问受保护的资源,就像用户在访问站点时实际进行了身份验证一样。

但是,在某些情况下,您可能希望强制用户在访问某些资源之前实际重新进行身份验证。例如,您可能不允许“记住我”用户更改密码。你可以通过利用一些特殊的“角色”来做到这一点:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
/ / src /控制器/ AccountController.php/ /……公共函数accountInfo()响应//允许任何已验证的用户-我们不关心他们是否只是//登录,或者通过“记住我”cookie登录->denyAccessUnlessGranted (“IS_AUTHENTICATED_REMEMBERED”);/ /……公共函数resetPassword()响应//要求用户在*this* session期间登录//如果他们只是通过记住我的cookie登录,他们//将被重定向到登录页面->denyAccessUnlessGranted (“IS_AUTHENTICATED_FULLY”);/ /……

在数据库中存储记住我令牌

令牌内容(包括用户密码的散列版本)默认存储在cookie中。如果希望将它们存储在数据库中,请使用DoctrineTokenProvider由Doctrine Bridge提供的课程。

首先,你需要注册DoctrineTokenProvider作为服务:

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/ services.yaml服务:#……ob娱乐下载Symfony \桥\学说\安全\ RememberMe \ DoctrineTokenProvider:

然后,您需要在数据库中创建一个具有以下结构的表DoctrineTokenProvider可以存储令牌:

1 2 3 4 5 6 7
创建表格“rememberme_token”“系列”字符88独特的主要的关键“价值”varchar88“lastUsed”datetime“类”varcharOne hundred.“用户名”varchar200);

请注意

如果使用DoctrineMigrationsBundle来管理数据库迁移,则需要告诉Doctrine忽略这个新迁移rememberme_token表:

  • YAML
  • XML
  • PHP
1 2 3 4
#配置/包/ doctrine.yaml原则:dbal:schema_filter:~ ^ ~ (? ! rememberme_token)

最后,设置token_provider选项remember_me配置到之前创建的服务:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
#配置/包/ security.yaml安全:#……防火墙:主要:#……remember_me:#……token_provider:Sob娱乐下载ymfony \桥\学说\安全\ RememberMe \ DoctrineTokenProvider”
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。