如何构建一个登录表单吗

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.1,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

准备创建一个登录表单吗?首先,确保你跟随主安全指南安装安全,创造你的用户类。

:身份验证命令从MakerBundle。根据您的设置,您可能会问不同的问题和你的生成的代码可能会略有不同:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
美元php bin /控制台:身份验证什么风格的身份验证你想要什么?(空的身份):[0]空认证器[1]登录表单身份验证> 1的类名创建身份验证(例如AppCustomAuthenticator): > LoginFormAuthenticator选择一个名字控制器类(例如SecurityController) [SecurityController]: > SecurityController创建:src /安全/ LoginFormAuthenticator。php更新:配置/包/安全。yaml创建:src /控制器/ SecurityController。/安全/ login.html.twig php创建:模板

1.8

支持添加到登录表单身份验证:身份验证在MakerBundle 1.8。

这个生成以下:1)登录路线&控制器,2)一个模板,它显示登录表单,3)后卫身份类处理登录提交和4)更新的主要安全配置文件。

步骤1。/登录路线和控制器:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25日26日
/ / src /控制器/ SecurityController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\路由\注释\路线;使用欧宝娱乐app下载地址\组件\安全\Http\身份验证\AuthenticationUtils;SecurityController扩展AbstractController{/ * * *@Route(name = " /登录”“app_login”) * /公共函数登录(AuthenticationUtils美元authenticationUtils):响应{/ /得到登录如果有一个错误美元错误=美元authenticationUtils- >getLastAuthenticationError ();/ /最后一个用户输入的用户名美元lastUsername=美元authenticationUtils- >getLastUsername ();返回美元- >呈现(“安全/ login.html.twig”,(“last_username”= >美元lastUsername,“错误”= >美元错误]);}}

步骤2。模板已经很少与安全:它只生成一个传统的HTML表单,提交/登录:

1 2 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 33 34 35 36
{%扩展“base.html。嫩枝' %}{%标题%}登录!{%endblock%}{%身体%}<形式方法=“职位”>{%如果错误%}<div=“警报alert-danger”>{{error.messageKey |反式(错误。messageData,“安全”)}}< /div>{%endif%}<h1=“h3 mb-3 font-weight-normal”>请登录< /h1><标签=“inputEmail”=“sr-only”>电子邮件< /标签><输入类型=“电子邮件”价值={{last_username}}的名字=“电子邮件”id=“inputEmail”=“表单控件”占位符=“电子邮件”要求自动对焦><标签=“inputPassword”=“sr-only”>密码< /标签><输入类型=“密码”的名字=“密码”id=“inputPassword”=“表单控件”占位符=“密码”要求><输入类型=“隐藏”的名字=“_csrf_token”价值={{csrf_token(验证)}}>{#取消这部分并添加一个remember_me选项下面防火墙功能激活记得我。见https://sym欧宝娱乐app下载地址fony.com/doc/current/security/remember_me.html < div class = "复选框mb-3 " > <标记> < input type = "复选框" name = " _remember_me " > < /标签> < / div >记得我#}<按钮=“btn btn-lg btn-primary”类型=“提交”>登录< /按钮>< /形式>{%endblock%}

步骤3。卫兵身份处理表单提交:

1 2 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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
/ / src /安全/ LoginFormAuthenticator.php名称空间应用程序\安全;使用应用程序\实体\用户;使用学说\ORM\EntityManagerInterface;使用欧宝娱乐app下载地址\组件\HttpFoundation\RedirectResponse;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;使用欧宝娱乐app下载地址\组件\路由\RouterInterface;使用欧宝娱乐app下载地址\组件\安全\核心\身份验证\令牌\TokenInterface;使用欧宝娱乐app下载地址\组件\安全\核心\编码器\UserPasswordEncoderInterface;使用欧宝娱乐app下载地址\组件\安全\核心\异常\InvalidCsrfTokenException;使用欧宝娱乐app下载地址\组件\安全\核心\安全;使用欧宝娱乐app下载地址\组件\安全\核心\用户\用户界面;使用欧宝娱乐app下载地址\组件\安全\核心\用户\UserProviderInterface;使用欧宝娱乐app下载地址\组件\安全\Csrf\CsrfToken;使用欧宝娱乐app下载地址\组件\安全\Csrf\CsrfTokenManagerInterface;使用欧宝娱乐app下载地址\组件\安全\警卫\身份验证\AbstractFormLoginAuthenticator;使用欧宝娱乐app下载地址\组件\安全\Http\跑龙套\TargetPathTrait;LoginFormAuthenticator扩展AbstractFormLoginAuthenticator{使用TargetPathTrait;私人美元entityManager;私人美元路由器;私人美元csrfTokenManager;私人美元passwordEncoder;公共函数__construct(EntityManagerInterface美元entityManager,RouterInterface美元路由器,CsrfTokenManagerInterface美元csrfTokenManager,UserPasswordEncoderInterface美元passwordEncoder){美元- >entityManager =美元entityManager;美元- >路由器=美元路由器;美元- >csrfTokenManager =美元csrfTokenManager;美元- >passwordEncoder =美元passwordEncoder;}公共函数支持(请求美元请求){返回“app_login”= = =美元请求- >属性- >get (“_route”)& &美元请求- >isMethod (“职位”);}公共函数getCredentials(请求美元请求){美元凭证= (“电子邮件”= >美元请求- >请求- >get (“电子邮件”),“密码”= >美元请求- >请求- >get (“密码”),“csrf_token”= >美元请求- >请求- >get (“_csrf_token”),);美元请求- >getSession ()- >集(安全::LAST_USERNAME,美元凭证(“电子邮件”]);返回美元凭证;}公共函数getUser(美元凭证,UserProviderInterface美元userProvider){美元令牌=CsrfToken (“验证”,美元凭证(“csrf_token”]);如果(!美元- >csrfTokenManager- >isTokenValid (美元令牌)){InvalidCsrfTokenException ();}美元用户=美元- >entityManager- >getRepository(用户::类)- >findOneBy ([“电子邮件”= >美元凭证(“电子邮件”]]);如果(!美元用户){/ /失败与自定义身份验证错误CustomUserMessageAuthenticationException (电子邮件不能被发现。);}返回美元用户;}公共函数checkCredentials(美元凭证,用户界面美元用户){返回美元- >passwordEncoder- >isPasswordValid (美元用户,美元凭证(“密码”]);}公共函数onAuthenticationSuccess(请求美元请求,TokenInterface美元令牌,美元providerKey){如果(美元定位路径=美元- >getTargetPath (美元请求- >getSession (),美元providerKey)){返回RedirectResponse (美元定位路径);}/ /例如:返回新RedirectResponse ($ this - >路由器- >生成(' some_route '));\异常(“TODO:提供一个有效的内部重定向”__FILE__);}受保护的函数getLoginUrl(){返回美元- >路由器- >生成(“app_login”);}}

步骤4。更新的主要安全配置文件启用卫兵身份:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
#配置/包/ security.yaml安全:#……防火墙:主要:#……警卫:身份验证器:- - - - - -App \安全\ LoginFormAuthenticator

CustomUserMessageAuthenticationException。这是一个简单的方法来控制错误消息。

但是在某些情况下,如果你回来checkCredentials (),您可能会看到一个错误,来自Symfony的核心——就像欧宝娱乐app下载地址无效的凭证。

定制这个消息,你可以扔一个CustomUserMessageAuthenticationException代替。或者,你也可以翻译消息通过安全域:

  • XML
  • YAML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12
< !- - - - - -- - - - - -translations/security.en.xlf -->< /span>< ?xml version = " 1.0 " ? ><xliff版本=“1.2”xmlns=“urn: oasis:名称:tc: xliff文档:1.2”><文件通过读=“en”数据类型=“明文”原始=“file.ext”><身体><trans-unitid=“无效凭证。”><>无效的凭证。< /><目标>您输入的密码是无效的!< /目标>< /trans-unit>< /身体>< /文件>< /xliff>

如果消息不翻译,确保您已经安装了翻译并尝试清理缓存:

1
美元php bin /控制台缓存:清楚

TargetPathTrait

最后一个请求URI是存储在一个会话变量命名_security。.target_path< /code>(如。_security.main.target_path如果你的防火墙的名字主要)。大多数时候你不需要处理这个低水平会话变量。然而,TargetPathTrait实用程序可以用来阅读(就像在上面的示例中)或手动设置这个值。

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