使用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_path
和check_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,“错误”= >美元错误]);}
请注意
如果你得到一个错误authenticationUtils美元
参数是缺失的,这可能是因为应用程序的控制器不定义为服务和标记controller.service_arguments
标签,如做的默认的服务。yaml的配置。
不要让这个控制器迷惑你。你会看到,当用户提交表单时,安全系统自动为您处理表单提交。如果用户提交一个无效的用户名或密码,该控制器读取表单提交错误从安全系统,以便它可以显示给用户。
换句话说,你的工作是显示登录表单和任何可能发生的登录错误,但是安全系统本身负责检查提交的用户名和密码,验证用户。
最后,创建模板:
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身份验证提供者如何保护你的登录表单。
这是它!提交表单时,安全系统将自动检查用户的证书和认证用户或发回用户的登录表单可以显示错误。
回顾整个过程:
- 用户试图访问资源的保护;
- 防火墙启动身份验证过程的重定向用户登录表单(
/登录
);
- 的
/登录
页面登录表单通过这个示例中创建的路线和控制器;
- 用户提交登录表单
/登录
;
- 安全系统拦截请求,检查用户提交的凭证,对用户进行身份验证,如果他们是正确的,并发送用户登录表单,如果他们不是。
- 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\控制器\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,“错误”= >美元错误]);}
请注意
如果你得到一个错误authenticationUtils美元
参数是缺失的,这可能是因为应用程序的控制器不定义为服务和标记controller.service_arguments
标签,如做的默认的服务。yaml的配置。
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身份验证提供者如何保护你的登录表单。
/登录
);/登录
页面登录表单通过这个示例中创建的路线和控制器;/登录
;登录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