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

编辑该页面

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

一旦用户通过身份验证,他们的凭证通常存储在会话中。这意味着当会话结束时他们将注销,必须提供登录细节下次他们希望访问应用程序。你可以允许用户选择登录呆的时间比会话持续使用cookieremember_me防火墙选项:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#配置/包/ security.yaml安全:#……防火墙:主要:#……remember_me:秘密:“% kernel.secret %”#需要生命周期:604800年# 1周在几秒钟内#默认情况下,启用了功能检查#复选框在登录表单(见下文),取消#线后总是启用它。# always_remember_me:真

秘密选项是唯一所需的选项,它是用来签署记得我饼干。这是共同使用kernel.secret参数,定义使用APP_SECRET环境变量。

后使remember_me系统配置中,有几个事情要做之前,记得我是正确的:

  1. 添加一个选择复选框来激活记得我;
  2. 使用一个支持记得我的身份;
  3. 可选地,配置如何记得我cookie存储和验证

这之后,记得我饼干将在成功创建身份验证。对于一些页面/动作,你可以强迫用户充分验证(即不通过一个记得我的饼干)更好的安全性。

请注意

remember_me设置包含许多设置配置这个特性造成的饼干。看到定制记得我饼干这些设置的完整描述。

激活系统记得我

使用记得我饼干并不总是适当的(例如,您不应该使用它在一个共享PC)。这就是为什么在默认情况下,Symfony要求用户ob娱乐下载选择记得我系统通过一个请求参数。

这个请求参数通常通过复选框设置的登录表单。此复选框必须有一个名称_remember_me:

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

请注意

可选地,您可以配置一个自定义名称复选框使用的名字设置下remember_me部分。

总是激活记得我

有时,您可能希望总是激活记得我系统和不允许用户选择退出。在这些情况下,您可以使用always_remember_me设置:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11
#配置/包/ security.yaml安全:#……防火墙:主要:#……remember_me:秘密:“% kernel.secret %”#……always_remember_me:真正的

现在,没有检查,每个成功的身份验证请求参数将产生一个记得我的饼干。

记得我支持添加到身份验证

并不是所有身份验证方法支持记得我(例如HTTP基本身份验证没有支持)。一个身份表明支持使用RememberMeBadge安全的护照

在登录之后,您可以使用安全分析器,看看这种徽章出现了:

如果没有这个徽章,记得我不会被激活(不管所有其他设置)。

记得我支持添加到自定义的身份验证器

当您使用一个自定义的身份验证时,您必须添加一个RememberMeBadge手动:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ / src /服务/ LoginAuthenticator.php名称空间应用程序\服务;/ /……使用ob娱乐下载\组件\安全\Http\身份验证\护照\徽章\RememberMeBadge;使用ob娱乐下载\组件\安全\Http\身份验证\护照\徽章\UserBadge;使用ob娱乐下载\组件\安全\Http\身份验证\护照\护照;LoginAuthenticator扩展AbstractAuthenticator{公共函数进行身份验证(请求美元请求):护照{/ /……返回护照(UserBadge (……)PasswordCredentials (…), (RememberMeBadge ()));}}

定制记得我令牌是如何存储的

记得我饼干包含一个令牌,用于验证用户的身份。这些令牌是长寿的,重要的是采取预防措施允许无效任何生成的令牌。

ob娱乐下载Symfony提供了两种方法来验证记得我令牌:

基于签名的令牌
默认情况下,记得我cookie包含签名基于用户的属性。如果属性改变,签名变化和生成的令牌已经不再被认为是有效的。看到如何添加“记住我”登录功能为更多的信息。
持续的令牌
持续的令牌存储任何生成的令牌(例如数据库)。这允许您无效标记通过改变数据库中的行。看到如何添加“记住我”登录功能为更多的信息。

请注意

您也可以编写自己的自定义处理程序创建一个类,它扩展了记得我AbstractRememberMeHandler(或实现RememberMeHandlerInterface)。然后您可以配置该自定义处理程序通过配置服务ID服务选择下remember_me

使用签名的记得我令牌

默认情况下,记得我饼干包含一个哈希用于验证cookie。这个哈希计算基于签名属性配置。

这些属性都包含在散列:

在这些之上,您可以配置使用的自定义属性signature_properties设置(默认为密码)。从用户属性获取对象使用PropertyAccess组件(如使用getUpdatedAt ()或一个公共updatedAt美元财产在使用updatedAt)。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11
#配置/包/ security.yaml安全:#……防火墙:主要:#……remember_me:秘密:“% kernel.secret %”#……signature_properties:(“密码”,“updatedAt”]

在这个例子中,记得我饼干将不再被认为是有效的如果updatedAt这个用户更改密码或用户标识符。

提示

签名属性允许一些高级用法无需设置存储所有记得我的令牌。例如,您可以添加一个forceReloginAt现场用户和签名属性。通过这种方式,您可以使所有记得我令牌从用户通过改变这个时间戳。

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

记得我的令牌的生命周期通常较长,你可能更愿意将它们保存在一个数据库来完全控制他们。ob娱乐下载Symfony提供了支持持续的记得我令牌。

这个实现使用一个记得我令牌供应商从数据库中存储和检索的令牌。DoctrineBridge提供一个令牌提供者使用原则。

您可以启用教义令牌提供者使用学说设置:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12
#配置/包/ security.yaml安全:#……防火墙:主要:#……remember_me:秘密:“% kernel.secret %”#……token_provider:原则:真正的

这也指导原则为记得我令牌创建一个表。如果你使用DoctrineMigrationsBundle,您可以创建一个新的迁移:

1 2 3 4
美元php bin /控制台学说:迁移:diff#,选择在本地运行迁移美元php bin /控制台学说:迁移:迁移

否则,您可以使用原则:模式:更新命令:

1 2 3 4 5
#获取所需的SQL代码美元php bin /控制台学说:模式:更新——dump-sql#运行SQL数据库客户端,或让命令运行它美元php bin /控制台学说:模式:更新——力量

实现一个自定义令牌提供者

您还可以创建一个自定义令牌提供者通过创建一个实现类TokenProviderInterface

然后,配置您的自定义令牌供应商的服务ID服务:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11
#配置/包/ security.yaml安全:#……防火墙:主要:#……remember_me:#……token_provider:服务:App \安全\ RememberMe \ CustomTokenProvider

迫使用户认证之前访问某些资源

当用户返回到您的站点时,他们自动验证基于信息存储在cookie记得我。这允许用户访问受保护的资源,如果用户已经通过身份验证访问该网站。

然而,在某些情况下,您可能想强迫用户认证之前访问某些资源。例如,您可能不允许用户更改其密码“记住我”。你可以利用一些特殊的“属性”:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/ / src /控制器/ AccountController.php/ /……公共函数accountInfo():响应{/ /允许任何身份验证的用户,我们不在乎他们/ /登录,或者是通过记住我登录饼干美元- >denyAccessUnlessGranted (“IS_AUTHENTICATED_REMEMBERED”);/ /……}公共函数resetPassword():响应{/ /要求用户登录在* *会话/ /如果他们只通过记住我登录cookie,他们/ /将被重定向到登录页面美元- >denyAccessUnlessGranted (“IS_AUTHENTICATED_FULLY”);/ /……}

提示

还有一个IS_REMEMBERED属性,授予访问权限只有通过记得我当用户身份验证机制。

remember_me配置包含许多选项来定制创建的饼干系统:

的名字(默认值:REMEMBERME)
cookie的名称用来保持用户登录。如果你使remember_me在几个防火墙功能相同的应用程序,一定要选择一个不同的名称为每个防火墙的饼干。否则,你将面临很多安全相关问题。
一生(默认值:31536000即1年以秒为单位)
的秒数后的cookie会过期。这定义了两个访问之间的最长时间为用户身份验证。
路径(默认值:/)
饼干的路径与使用该特性。默认情况下,cookie将被应用到整个网站但你可以限制到一个特定的部分(如。/论坛,/管理)。
(默认值:)
饼干的域与使用该特性。默认情况下饼干使用当前域获得$ _SERVER
安全(默认值:)
如果真正的,与此功能相关的cookie发送给用户通过HTTPS安全连接。
httponly(默认值:真正的)
如果真正的,饼干与此功能只能通过HTTP协议。这意味着饼干不会访问的脚本语言,比如JavaScript。
samesite(默认值:)
如果设置为严格的,与此功能相关的饼干不会跨站点请求一起发送,即使在普通链接。
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
ob娱乐下载Symfony 6.0支持通过SensioLabs