如何添加“记得我”登录功能
编辑本页警告:您正在浏览的文档欧宝官网下载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_me
Firewall定义了以下配置选项:
-
秘密
(要求) -
用于加密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)独特的主要的关键不零,“价值”varchar(88)不零,“lastUsed”datetime不零,“类”varchar(One hundred.)不零,“用户名”varchar(200)不零);
请注意
如果使用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”