使用form_login身份验证提供者

编辑本页

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

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

ob娱乐下载Symfony是内置的form_login自动处理登录表单POST的系统。在开始之前,请确保您遵循了安全指南创建你的User类。

form_login防火墙下:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
#配置/包/ security.yaml安全:#……防火墙:主要:匿名:懒惰的form_login:login_path:登录check_path:登录

提示

login_path而且check_path也可以是路由名(但不能有强制通配符-例如。/登录/ {foo}在哪里喷火没有默认值)。

现在,当安全系统启动身份验证过程时,它将用户重定向到登录表单/登录.实现这个登录表单是您的工作。首先,创建一个新的SecurityController

1 2 3 4 5 6 7 8
/ / src /控制器/ SecurityController.php名称空间应用程序控制器使用ob娱乐下载FrameworkBundle控制器AbstractControllerSecurityController扩展AbstractController{}

接下来,配置前面在您的目录下使用的路由form_login配置(登录):

  • 注释
  • YAML
  • XML
12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src /控制器/ SecurityController.php/ /……使用ob娱乐下载组件路由注释路线SecurityController扩展AbstractController/ * * *@Route(name = " /登录”“登录”,方法={“会”、“文章”})* /公共函数登录(){}}

太棒了!接下来,将逻辑添加到登录()显示登录表单:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src /控制器/ SecurityController.php使用ob娱乐下载组件安全Http身份验证AuthenticationUtils公共函数登录(AuthenticationUtilsauthenticationUtils//如果有登录错误,则获取登录错误错误authenticationUtils->getLastAuthenticationError ();//用户输入的最后一个用户名lastUsernameauthenticationUtils->getLastUsername ();返回->呈现(“安全/ login.html.twig”, (“last_username”= >lastUsername“错误”= >错误]);}

不要让这个控制器迷惑你。稍后您将看到,当用户提交表单时,安全系统将自动为您处理表单提交。如果用户提交了无效的用户名或密码,该控制器将从安全系统读取表单提交错误,以便将其显示给用户。

换句话说,你的工作就是显示登录表单和可能发生的任何登录错误,但是安全系统本身负责检查提交的用户名和密码并对用户进行身份验证。

最后,创建模板:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
{/安全/ login.html #模板。树枝#}{#……你可能会扩展你的基本模板,比如base.html.twig #}{%如果错误%}<div>{{error.messageKey |反式(错误。messagdata, 'security')}}div>{%endif%}<形式行动{{path('login')}}方法“职位”><标签“用户名”>用户名:标签><输入类型“文本”id“用户名”的名字“_username”价值{{last_username}}/><标签“密码”>密码:标签><输入类型“密码”id“密码”的名字“_password”/>{#如果你想控制用户成功重定向到的URL(更多细节如下) #}<按钮类型“提交”>登录按钮>形式>

提示

错误的实例AuthenticationException.它可能包含关于身份验证失败的更多信息(甚至是敏感信息),因此要明智地使用它!

表单可以看起来像任何东西,但它通常遵循一些约定:

  • <形式>元素发送一个帖子登录路由,因为这是您在form_login关键在security.yaml
  • username字段包含名称_username密码字段有名称_password

提示

实际上,所有这些都可以在form_login关键。看到安全配置参考(SecurityBundle)欲知详情。

谨慎

此登录表单目前没有针对CSRF攻击进行保护。读使用form_login身份验证提供者关于如何保护您的登录表单。

就是这样!当您提交表单时,安全系统将自动检查用户的凭据,并对用户进行身份验证,或者将用户发送回可以显示错误的登录表单。

回顾整个过程:

  1. 用户试图访问受保护的资源;
  2. 防火墙通过将用户重定向到登录表单(/登录);
  3. /登录页面通过本例中创建的路由和控制器呈现登录表单;
  4. 用户将登录表单提交给/登录
  5. 安全系统拦截请求,检查用户提交的凭据,验证用户是否正确,如果不正确则将用户发送回登录表单。

登录CSRF攻击可以使用在登录表单中添加隐藏CSRF令牌的相同技术来防止。Security组件已经提供了CSRF保护,但是在使用它之前需要配置一些选项。

首先,在安全配置中配置表单登录所使用的CSRF令牌提供程序。你可以设置为使用安全组件中的默认提供程序:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
#配置/包/ security.yaml安全:#……防火墙:secured_area:#……form_login:#……csrf_token_generator:security.csrf.token_manager

然后,使用csrf_token ()函数在Twig模板中生成一个CSRF令牌,并将其存储为表单的隐藏字段。默认情况下,必须调用HTML字段_csrf_token用于生成该值的字符串必须为进行身份验证

12 3 4 5 6 7 8 9 10 11 12
{/安全/ login.html #模板。树枝#}{#……#}<形式行动{{path('login')}}方法“职位”>{#……登录字段#}<输入类型“隐藏”的名字“_csrf_token”价值{{csrf_token('authenticate')}}><按钮类型“提交”>登录按钮>形式>

在此之后,您已经保护了登录表单免受CSRF攻击。

提示

您可以通过设置更改字段的名称csrf_parameter并通过设置更改令牌IDcsrf_token_id在您的配置中:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11
#配置/包/ security.yaml安全:#……防火墙:secured_area:#……form_login:#……csrf_parameter:_csrf_security_tokencsrf_token_id:a_private_string

http://www.example.com/admin/post/18/edit,然后在他们成功登录后,他们将被发送回http://www.example.com/admin/post/18/edit

这是通过将请求的URL存储在会话中来实现的。如果会话中没有URL(可能用户直接跳转到登录页面),那么用户将被重定向到/(即网页)。您可以通过几种方式改变这种行为。

failure_path选项,通过相对/绝对URL或Symfony路由名定义一个新目标:ob娱乐下载

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
#配置/包/ security.yaml安全:#……防火墙:主要:#……form_login:#……failure_path:login_failure_route_name

此选项也可以通过_failure_path请求参数:

1
http://example.com/some/path?_failure_path=/forgot-password
1 2 3 4 5 6 7
{/安全/ login.html #模板。树枝#}<形式行动{{path('login')}}方法“职位”>{#……#}<输入类型“隐藏”的名字“_failure_path”价值{{path('忘记密码')}}/><输入类型“提交”的名字“登录”/>形式>

target_path_parameter而且failure_path_parameter定义登录表单的防火墙的选项。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
#配置/包/ security.yaml安全:#……防火墙:主要:#……form_login:target_path_parameter:go_tofailure_path_parameter:back_to

使用上面的配置,查询字符串参数和隐藏表单字段现在是完全定制的:

1
http://example.com/some/path?go_to=/dashboard&back_to=/forgot-password
1 2 3 4 5 6 7 8
{/安全/ login.html #模板。树枝#}<形式行动{{path('login')}}方法“职位”>{#……#}<输入类型“隐藏”的名字“go_to”价值{{path('dashboard')}}/><输入类型“隐藏”的名字“back_to”价值{{path('忘记密码')}}/><输入类型“提交”的名字“登录”/>形式>