如何构建一个传统的登录表单吗

编辑该页面

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

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

提示

如果你需要一个登录表单并存储用户的数据库,那么您应该考虑使用FOSUserBundle帮助你建立你的用户对象和给你许多航线和控制器等常见任务的登录,注册,忘记密码。

在这个条目,您将构建一个传统的登录表单。当然,当用户登录时,您可以加载用户从任何地方——比如数据库。看到安全获取详细信息。

首先,启用表单登录在防火墙:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
# app / config / security.yml安全:#……防火墙:主要:匿名:~form_login:login_path:登录check_path:登录

提示

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

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

1 2 3 4 5 6 7 8
/ / src / AppBundle /控制器/ SecurityController.php名称空间AppBundle\控制器;使用ob娱乐下载\\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/ /……使用ob娱乐下载\组件\HttpFoundation\请求;使用Sensio赞助\\FrameworkExtraBundle\配置\路线;SecurityController扩展控制器{/ * * *@Route(name = " /登录”“登录”)* /公共函数loginAction(请求美元请求){}}

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/ / src / AppBundle /控制器/ SecurityController.php公共函数loginAction(请求美元请求){美元authenticationUtils=美元- >get (“security.authentication_utils”);/ /得到登录如果有一个错误美元错误=美元authenticationUtils- >getLastAuthenticationError ();/ /最后一个用户输入的用户名美元lastUsername=美元authenticationUtils- >getLastUsername ();返回美元- >呈现(“安全/ login.html.twig”,数组(/ /最后一个用户输入的用户名“last_username”= >美元lastUsername,“错误”= >美元错误));}

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

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

最后,创建模板:

  • 嫩枝
  • 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”价值= " /帐户" / > #}<按钮类型=“提交”>登录< /按钮>< /形式>

提示

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

表单可以看起来像什么,但是有几个要求:

  • 表单必须发布登录路线,因为这是你下的配置form_login关键在security.yml
  • 用户名必须有名字_username必须有名称和密码_password

提示

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

谨慎

这个登录表单目前不是防止CSRF攻击。读在登录表单使用CSRF保护如何保护你的登录表单。

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

回顾整个过程:

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

ROLE_ADMIN角色(包括所有的url/登录URL),将导致一个重定向循环:

  • YAML
  • XML
  • PHP
1 2 3 4 5
# app / config / security.yml#……access_control:- - - - - -{路径:^ /,角色:ROLE_ADMIN}

添加一个访问控制相匹配/登录/ *并要求没有验证修复存在的问题:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
# app / config / security.yml#……access_control:- - - - - -{路径:^ /登录,角色:IS_AUTHENTICATED_ANONYMOUSLY}- - - - - -{路径:^ /,角色:ROLE_ADMIN}

另外,如果您的防火墙允许匿名用户(没有匿名键),您需要创建一个特殊的防火墙允许匿名用户登录页面:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11
# app / config / security.yml#……防火墙:#订单事宜!这一定是之前^ /防火墙login_firewall:模式:^ /登录美元匿名:~secured_area:模式:^ /form_login:~

SecurityBundle配置(“安全”)对于不同的防火墙。但是通常对于大多数应用程序,有一个主要的防火墙就足够了。

如何自定义错误页面吗为更多的细节。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
< /article>