如何构建一个传统的登录表单吗
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.7,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。
在这个条目,您将构建一个传统的登录表单。当然,当用户登录时,您可以加载用户从任何地方——比如数据库。看到安全获取详细信息。
首先,启用表单登录在防火墙:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10
# app / config / security.yml安全:#……防火墙:主要:匿名:~form_login:login_path:登录check_path:登录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
< !- - - - - -- - - - - -app/config/security.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><srv:容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security”xmlns:深水救生艇=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><配置><防火墙的名字=“主要”><匿名/ ><登录登录路径=“登录”看看路径=“登录”/ >< /防火墙>< /配置>< /srv:容器>
1 2 3 4 5 6 7 8 9 10 11 12
/ / app / config / security.php美元容器- >loadFromExtension (“安全”,数组(“防火墙”= >数组(“主要”= >数组(“匿名”= >零,“form_login”= >数组(“login_path”= >“登录”,“check_path”= >“登录”)))));
提示
的login_path
和check_path
也可以路线名称(但不能有强制性的通配符,如。/登录/ {foo}
在哪里喷火
没有默认值)。
现在,当安全系统启动验证过程,它会将用户重定向到登录表单/登录
。你的工作是实现这个登录表单。首先,创建一个新的SecurityController
在一个包:
1 2 3 4 5 6 7 8
/ / src / AppBundle /控制器/ SecurityController.php名称空间AppBundle\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\控制器;类SecurityController扩展控制器{}
接下来,配置路由,你之前在你的使用form_login
配置(登录
):
- 注释
- YAML
- XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / AppBundle /控制器/ SecurityController.php/ /……使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;使用Sensio赞助\包\FrameworkExtraBundle\配置\路线;类SecurityController扩展控制器{/ * * *@Route(name = " /登录”“登录”)* /公共函数loginAction(请求美元请求){}}
1 2 3 4
# app / config / routing.yml登录:路径:/登录默认值:{_controller:AppBundle:安全:登录}
1 2 3 4 5 6 7 8 9 10 11
< !- - - - - -- - - - - -app/config/routing.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“登录”路径=“/登录”><默认的关键=“_controller”>AppBundle:安全:登录< /默认的>< /路线>< /路线>
太棒了!接下来,添加的逻辑loginAction ()
显示登录表单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src / AppBundle /控制器/ SecurityController.php公共函数loginAction(请求美元请求){美元authenticationUtils=美元这- >get (“security.authentication_utils”);/ /得到登录如果有一个错误美元错误=美元authenticationUtils- >getLastAuthenticationError ();/ /最后一个用户输入的用户名美元lastUsername=美元authenticationUtils- >getLastUsername ();返回美元这- >呈现(“安全/ login.html.twig”,数组(“last_username”= >美元lastUsername,“错误”= >美元错误));}
2.6
的security.authentication_utils
服务和AuthenticationUtils类是在Symfony 2.6中引入的。欧宝娱乐app下载地址
不要让这个控制器迷惑你。你会看到,当用户提交表单时,安全系统自动为您处理表单提交。如果用户提交一个无效的用户名或密码,该控制器读取表单提交错误从安全系统,以便它可以显示给用户。
换句话说,你的工作是显示登录表单和任何可能发生的登录错误,但是安全系统本身负责检查提交的用户名和密码,验证用户。
最后,创建模板:
- 嫩枝
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
{# app /资源/视图/安全/ login.html。树枝#}{#……你可能会延长你的基础模板,像base.html。树枝#}{%如果错误%}<div>{{error.messageKey |反式(错误。messageData,“安全”)}}< /div>{%endif%}<形式行动=”{{路径(“登录”)}}”方法=“职位”><标签为=“用户名”>用户名:< /标签><输入类型=“文本”id=“用户名”的名字=“_username”价值=”{{last_username}}”/ ><标签为=“密码”>密码:< /标签><输入类型=“密码”id=“密码”的名字=“_password”/ >{#如果你想控制用户的URL重定向到成功(更多细节下文)< input type = "隐藏" name =“_target_path”价值= " /帐户" / > #}<按钮类型=“提交”>登录< /按钮>< /形式>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
< !- - - - - -- - - - - -src/AppBundle/Resources/views/Security/login.html.php -->< /span>< ? php如果(美元错误):? ><div>< ? php回声美元错误- >getMessage ()? >< /div>< ? phpendif? ><形式行动=“< ?php echo $视图(“路由器”)- >生成(“登录”)? > "方法=“职位”><标签为=“用户名”>用户名:< /标签><输入类型=“文本”id=“用户名”的名字=“_username”价值=“< ?php echo $ last_username ? > "/ ><标签为=“密码”>密码:< /标签><输入类型=“密码”id=“密码”的名字=“_password”/ >< !- - - - - -- - - - - -如果you want to control the URL the user is redirected to on success (more details below) -->< /span><按钮类型=“提交”>登录< /按钮>< /形式>
提示
的错误
变量传递到模板的一个实例AuthenticationException。它可能包含更多的信息,甚至敏感信息——关于身份验证失败,所以明智的使用它!
可以像任何形式,但它通常遵循一些惯例:
- 的
<形式>
发送一个元素帖子
请求登录
路线,因为这是你下的配置form_login
关键在security.yml
; - 用户名字段的名称
_username
和密码字段的名称_password
。
提示
实际上,所有这些可以根据配置form_login
关键。看到SecurityBundle配置(“安全”)为更多的细节。
谨慎
这个登录表单目前不是防止CSRF攻击。读在登录表单使用CSRF保护如何保护你的登录表单。
这是它!提交表单时,安全系统将自动检查用户的证书和认证用户或发回用户的登录表单可以显示错误。
回顾整个过程:
- 用户试图访问资源的保护;
- 防火墙启动身份验证过程的重定向用户登录表单(
/登录
); - 的
/登录
页面登录表单通过这个示例中创建的路线和控制器; - 用户提交登录表单
/登录
; - 安全系统拦截请求,检查用户提交的凭证,对用户进行身份验证,如果他们是正确的,并发送用户登录表单,如果他们不是。