使用form_login身份验证提供者

编辑该页面

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

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

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

form_login在你的防火墙:

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

提示

login_pathcheck_path也可以路线名称(但不能有强制性的通配符,如。/登录/ {foo}在哪里喷火没有默认值)。

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

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

接下来,配置路由,你之前在你的使用form_login配置(登录):

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

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

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

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

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

最后,创建模板:

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

提示

错误变量传递到模板的一个实例AuthenticationException。它可能包含更多的信息,甚至敏感信息——关于身份验证失败,所以明智的使用它!

可以像任何形式,但它通常遵循一些惯例:

  • <形式>发送一个元素帖子请求登录路线,因为这是你下的配置form_login关键在security.yaml;
  • 用户名字段的名称_username和密码字段的名称_password

提示

实际上,所有这些可以根据配置form_login关键。看到安全配置引用(SecurityBundle)为更多的细节。

谨慎

这个登录表单目前不是防止CSRF攻击。读使用form_login身份验证提供者如何保护你的登录表单。

这是它!提交表单时,安全系统将自动检查用户的证书和认证用户或发回用户的登录表单可以显示错误。

回顾整个过程:

  1. 用户试图访问资源的保护;
  2. 防火墙启动身份验证过程的重定向用户登录表单(/登录);
  3. /登录页面登录表单通过这个示例中创建的路线和控制器;
  4. 用户提交登录表单/登录;
  5. 安全系统拦截请求,检查用户提交的凭证,对用户进行身份验证,如果他们是正确的,并发送用户登录表单,如果他们不是。

登录CSRF攻击可以避免使用相同的技术隐藏CSRF标记添加到登录表单。安全组件已经提供了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 ()函数在树枝模板来生成一个CSRF令牌并将其存储为表单的隐藏字段。默认情况下,必须调用HTML字段_csrf_token和用于生成值必须是字符串进行身份验证:

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

在这之后,你有保护你的登录表单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 #模板。树枝#}<形式行动={{路径(“登录”)}}方法=“职位”>{#……#}<输入类型=“隐藏”的名字=“_failure_path”价值={{路径(forgot_password)}}/ ><输入类型=“提交”的名字=“登录”/ >< /形式>

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 #模板。树枝#}<形式行动={{路径(“登录”)}}方法=“职位”>{#……#}<输入类型=“隐藏”的名字=“go_to”价值={{路径(仪表板)}}/ ><输入类型=“隐藏”的名字=“back_to”价值={{路径(forgot_password)}}/ ><输入类型=“提交”的名字=“登录”/ >< /形式>