如何建立一个传统的登录表单
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.3,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 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:登录
提示
的login_path
而且check_path
也可以是路由名(但不能有强制通配符-例如。/登录/ {foo}
在哪里喷火
没有默认值)。
现在,当安全系统启动身份验证过程时,它将用户重定向到登录表单/登录
.可视化地实现这个登录表单是您的工作。首先,创建一个新的SecurityController
在一个bundle内部:
1 2 3 4 5 6 7 8
/ / src / AppBundle /控制器/ SecurityController.php名称空间AppBundle\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;类SecurityController扩展控制器{}
接下来,配置前面在您的目录下使用的路由form_login
配置(登录
):
- 注释
- YAML
- XML
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / AppBundle /控制器/ SecurityController.php/ /……使用ob娱乐下载\组件\HttpFoundation\请求;使用Sensio赞助\包\FrameworkExtraBundle\配置\路线;类SecurityController扩展控制器{/ * * *@Route("/login", name="login") */公共函数loginAction(请求$请求){}}
太棒了!接下来,将逻辑添加到loginAction
将显示登录表单:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/ / src / AppBundle /控制器/ SecurityController.php/ /……使用ob娱乐下载\组件\安全\核心\SecurityContextInterface;/ /……公共函数loginAction(请求$请求){$会话=$请求->getSession ();//如果有登录错误,则获取登录错误如果($请求->属性->(SecurityContextInterface::AUTHENTICATION_ERROR)) {$错误=$请求->属性->get (SecurityContextInterface::AUTHENTICATION_ERROR);}elseif(零= = !$会话& &$会话->(SecurityContextInterface::AUTHENTICATION_ERROR)) {$错误=$会话->get (SecurityContextInterface::AUTHENTICATION_ERROR);$会话->remove (SecurityContextInterface::AUTHENTICATION_ERROR);}其他的{$错误=零;}//用户输入的最后一个用户名$lastUsername= (零= = =$会话) ?”:$会话->get (SecurityContextInterface::LAST_USERNAME);返回$这->呈现(“安全/ login.html.twig”,数组(//用户输入的最后一个用户名“last_username”= >$lastUsername,“错误”= >$错误,));}
不要让这个控制器迷惑你。稍后您将看到,当用户提交表单时,安全系统将自动为您处理表单提交。如果用户提交了无效的用户名或密码,该控制器将从安全系统读取表单提交错误,以便将其显示给用户。
换句话说,你的工作就是显示登录表单和可能发生的任何登录错误,但是安全系统本身负责检查提交的用户名和密码并对用户进行身份验证。
最后,创建模板:
- 嫩枝
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
{# app /资源/视图/安全/ login.html。树枝#}{#……你可能会扩展你的基模板,比如base.html.twig #}{%如果错误%}<div>{{error.messageKey |反式(错误。messagdata, 'security')}}div>{%endif%}<形式行动="{{path('login')}}"方法=“职位”><标签为=“用户名”>用户名:标签><输入类型=“文本”id=“用户名”的名字=“_username”价值="{{last_username}}"/><标签为=“密码”>密码:标签><输入类型=“密码”id=“密码”的名字=“_password”/>{#如果你想控制用户成功重定向到的URL(更多细节如下) #}<按钮类型=“提交”>登录按钮>形式>
提示
的错误
的实例AuthenticationException.它可能包含关于身份验证失败的更多信息(甚至是敏感信息),因此要明智地使用它!
表单可以看起来像任何东西,但有几个要求:
- 表单必须POST到
登录
路由,因为这是您在form_login
关键在security.yml
. - 用户名必须有名称
_username
密码必须有名字_password
.
提示
实际上,所有这些都可以在form_login
关键。看到SecurityBundle配置("security")欲知详情。
谨慎
此登录表单目前没有针对CSRF攻击进行保护。读在登录表单中使用CSRF保护关于如何保护您的登录表单。
就是这样!当您提交表单时,安全系统将自动检查用户的凭据,并对用户进行身份验证,或者将用户发送回可以显示错误的登录表单。
回顾整个过程:
- 用户试图访问受保护的资源;
- 防火墙通过将用户重定向到登录表单(
/登录
); - 的
/登录
页面通过本例中创建的路由和控制器呈现登录表单; - 用户将登录表单提交给
/登录
; - 安全系统拦截请求,检查用户提交的凭据,验证用户是否正确,如果不正确则将用户发送回登录表单。
/管理/ foo).如果用户最初直接进入登录页面,他们将被重定向到主页。这些都可以自定义,例如,允许您将用户重定向到特定的URL。
有关这一点以及如何定制表单登录过程的详细信息,请参见如何自定义您的表单登录.
/登录路由,并且它对应于login_path
而且check_path
配置值。这里的错误配置可能意味着您被重定向到404页面而不是登录页面,或者提交登录表单没有任何作用(您只是一遍又一遍地看到登录表单)。
login_path
而且check_path
配置值。这里的错误配置可能意味着您被重定向到404页面而不是登录页面,或者提交登录表单没有任何作用(您只是一遍又一遍地看到登录表单)。