防火墙的部分配置/包/ security.yaml大多数重要的部分。“防火墙”是你的认证系统:防火墙定义应用程序的哪些部分有如何用户将能够进行身份验证(例如登录表单,API的令牌,等等)。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#配置/包/ security.yaml安全:#……防火墙:戴夫:模式:^ /(_(分析器| wdt) | css |图片| js) /安全:主要:懒惰:真正的#提供者设置在早些时候提供者供应商:app_user_provider#激活不同的方式进行身份验证# https://欧宝娱乐app下载地址www.oldmanjams.com/doc/current/security.html firewalls-authentication# https://欧宝娱乐app下载地址www.oldmanjams.com/doc/current/security/impersonating_user.html# switch_user:真

只有一个防火墙是活跃在每个请求:Symfony使用欧宝娱乐app下载地址模式找到第一个匹配的关键(你也可以<一个href=”//www.oldmanjams.com/doc/6.0/security/firewall_restriction.html" class="reference internal">比赛由主机或其他的东西)。

dev防火墙是一个假的防火墙:确保你不意外块Symfony的开发工具——生活在url欧宝娱乐app下载地址/ _profiler/ _wdt

所有真正的url的处理主要防火墙(不模式关键是它匹配所有url)。防火墙可以有许多的身份验证模式,换句话说,它使许多方法来问“你是谁?”的问题。

通常,用户是未知的(即没有登录),当他们第一次访问你的网站。如果你现在访问你的主页,你访问,你会发现你访问一个页面工具栏中的防火墙后面:

访问URL下防火墙并不一定需要你验证(例如登录表单必须访问或应用程序的一些部分是公开的)。您将学习如何限制访问url,控制器或其他在你的防火墙<一个href=”//www.oldmanjams.com/doc/6.0/security.html" class="reference internal">访问控制部分。

提示

懒惰的匿名的方式阻止会话开始如果没有必要授权(即显式检查用户特权)。这是很重要的保持请求缓存(参见<一个href=”//www.oldmanjams.com/doc/6.0/http_cache.html" class="reference internal">HTTP缓存)。

< /div>

请注意

如果您没有看到工具栏,安装<一个href=”//www.oldmanjams.com/doc/6.0/profiler.html" class="reference internal">分析器:

1
美元作曲家要求- dev symfony / pr欧宝娱乐app下载地址ofiler-pack

现在,我们了解我们的防火墙,下一步是创建一个为您的用户进行身份验证!

表单登录< /li>
  • JSON登录< /li>
  • HTTP基本< /li>
  • 登录链接< /li>
  • x客户端证书< /li>
  • 远程用户< /li>
  • 自定义的身份验证器< /li>

    提示

    如果您的应用程序日志的用户通过第三方服务,如谷歌、Facebook或Twitter登录(社会),查看<一个href=”https://github.com/hwi/HWIOAuthBundle" class="reference external" rel="external noopener noreferrer" target="_blank">HWIOAuthBundle欧宝下载链接社区包。

    < /div>
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    / / src /控制器/ LoginController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\路由\注释\路线;LoginController扩展AbstractController{#(路线(“/登录”,名字:“app_login”))公共函数指数():响应{返回美元- >呈现(“登录/ index.html.twig”,(“controller_name”= >“LoginController”]);}}

    然后,启用表单登录身份验证使用form_login设置:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8 9 10 11
    #配置/包/ security.yaml安全:#……防火墙:主要:#……form_login:#“app_login”的名字是先前创建的路线login_path:app_logincheck_path:app_login

    请注意

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

    < /div>

    一旦启用,安全系统重定向未经身份验证的游客login_path当他们试图访问一个安全的地方(这种行为可以定制<一个href=”//www.oldmanjams.com/doc/6.0/security/access_denied_handler.html" class="reference internal">认证入口点)。

    编辑登录控制器呈现登录表单:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
    / /……+使用Sym欧宝娱乐app下载地址fony组件\ \安全\ Http身份验证\ \ AuthenticationUtils;类LoginController延伸AbstractController{#[路线(“/登录”,名字:“app_login”))公共函数指数():反应+公共函数指数(AuthenticationUtils AuthenticationUtils美元):反应{+ / /如果有一个得到登录错误+ $ = $ authenticationUtils错误- > getLastAuthenticationError ();++ / /最后一个用户输入的用户名+ $ lastUsername = $ authenticationUtils - > getLastUsername ();+返回$ this - >渲染(“登录/ index . html。嫩枝”,(——“controller_name”= >“LoginController”,+“last_username”= > lastUsername美元,+ '错误' = >美元错误,]);}}

    不要让这个控制器迷惑你。它的工作就是唯一渲染形式:form_login身份验证处理表单提交自动。如果用户提交一个无效的电子邮件或密码,身份将存储错误和重定向回这个控制器,我们读错误(使用AuthenticationUtils),这样就可以显示给用户。

    最后,创建或更新的模板:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
    {#模板/登录/ index . html。树枝#}{%扩展“base.html。嫩枝' %}{#……#}{%身体%}{%如果错误%}<div>{{error.messageKey |反式(错误。messageData,“安全”)}}< /div>{%endif%}<形式行动={{路径(app_login)}}方法=“职位”><标签=“用户名”>电子邮件:< /标签><输入类型=“文本”id=“用户名”的名字=“_username”价值={{last_username}}/ ><标签=“密码”>密码:< /标签><输入类型=“密码”id=“密码”的名字=“_password”/ >{#如果你想控制用户的URL重定向到成功< input type = "隐藏" name =“_target_path”价值= " /帐户" / > #}<按钮类型=“提交”>登录< /按钮>< /形式>{%endblock%}
  • 谨慎

    错误变量传递到模板的一个实例<一个href=”https://github.com/symfony/symfony/blob/6.0/src/Symfony/Component/Security/Core/Exception/AuthenticationException.php" class="reference external" title="AuthenticationException”rel="external noopener noreferrer" target="_blank">AuthenticationException。它可能包含敏感信息的身份验证失败。从来没有使用error.message:使用messageKey性质相反,如例子所示。显示此消息总是安全的。

    < /div>

    可以像任何形式,但它通常遵循一些惯例:

    提示

    实际上,所有这些可以根据配置form_login关键。看到<一个href=”//www.oldmanjams.com/doc/6.0/reference/configuration/security.html" class="reference internal">安全配置引用(SecurityBundle)为更多的细节。

    < /div>

    谨慎

    这个登录表单目前不是防止CSRF攻击。读<一个href=”//www.oldmanjams.com/doc/6.0/security.html" class="reference internal">安全如何保护你的登录表单。

    < /div>

    这是它!当你提交表单时,安全系统自动读取_username_password参数后,加载用户通过用户提供者,检查用户的凭证和对用户进行身份验证或将它们发送回错误可以显示的登录表单。

    回顾整个过程:

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

    另请参阅

    您可以自定义响应成功或失败的登录尝试。看到<一个href=”//www.oldmanjams.com/doc/6.0/security/form_login.html" class="reference internal">自定义表单登录身份验证响应

    < /div>

    登录CSRF攻击可以避免使用相同的技术隐藏CSRF标记添加到登录表单。安全组件已经提供了CSRF保护,但您需要配置一些选项之前使用它。

    首先,您需要启用CSRF表单登录:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8 9 10
    #配置/包/ security.yaml安全:#……防火墙:secured_area:#……form_login:#……enable_csrf:真正的

    然后,使用csrf_token ()函数在树枝模板来生成一个CSRF令牌并将其存储为表单的隐藏字段。默认情况下,必须调用HTML字段_csrf_token和用于生成值必须是字符串进行身份验证:

    1 2 3 4 5 6 7 8 9 10
    {#模板/登录/ index . html。树枝#}{#……#}<形式行动={{路径(app_login)}}方法=“职位”>{#……登录字段#}<输入类型=“隐藏”的名字=“_csrf_token”价值={{csrf_token(验证)}}><按钮类型=“提交”>登录< /按钮>< /形式>

    在这之后,你有保护你的登录表单CSRF攻击。

    提示

    你可以改变通过设置的名称字段csrf_parameter通过设置和改变令牌IDcsrf_token_id在你的配置。看到<一个href=”//www.oldmanjams.com/doc/6.0/reference/configuration/security.html" class="reference internal">安全配置引用(SecurityBundle)为更多的细节。

    < /div>

    json_login设置:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8 9 10
    #配置/包/ security.yaml安全:#……防火墙:主要:#……json_login:我们将创建以下# api_login是一个途径check_path:api_login

    请注意

    check_path支持url和路线名称(但不能有强制性的通配符,如。/登录/ {foo}在哪里喷火没有默认值)。

    < /div>

    身份运行时客户机请求check_path。首先,创建一个控制器路径:

    1 2 3
    美元php bin /控制台:控制器——没有模板ApiLogin创建:src /控制器/ ApiLoginController.php
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
    / / src /控制器/ ApiLoginController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用欧宝娱乐app下载地址\组件\路由\注释\路线;ApiLoginController扩展AbstractController{#(路线(“/ api /登录”,名字:“api_login”))公共函数指数():响应{返回美元- >json ([“消息”= >“欢迎来到你的新控制器!”,“路径”= >“src /控制器/ ApiLoginController.php”]);}}

    这个登录控制器将被称为身份验证成功后对用户进行身份验证。你可以通过身份验证的用户,生成一个令牌(或任何你需要返回)和返回的JSON响应:

    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日
    / /……+使用App \实体\用户;+使用Sym欧宝娱乐app下载地址fony Http \ \安全\ \组件属性\ CurrentUser;类ApiLoginController延伸AbstractController{#[路线(“/ api /登录”,名字:“api_login”))公共函数指数():反应+公共函数指数(# (CurrentUser) ?用户$ User):反应{+如果(null = = = $ user) {+ $ this - >返回json ([+“消息”= >“缺失的凭证”,+),反应::HTTP_UNAUTHORIZED);+}++ $牌=…;/ /为$ user创建一个API的令牌+返回json ([$ this - >——“消息”= >“欢迎你的新控制器!”——“路径”= >“src /控制器/ ApiLoginController.php”,+“用户”= > $ user - > getUserIdentifier (),+“令牌”= >美元令牌,]);}}

    请注意

    # (CurrentUser)只能用于控制器参数检索通过身份验证的用户。在服务中,您将使用<一个href=”https://github.com/symfony/symfony/blob/6.0/src/Symfony/Component/Security/Core/Security.php" class="reference external" title="getUser ()”rel="external noopener noreferrer" target="_blank">getUser ()

    < /div>

    就是这样!总结的过程:

    1. 一个客户端(如前端)POST请求内容类型:application / json头来/ api /登录用户名(即使你的标识符实际上是一个电子邮件)密码密钥:

      1 2 3 4
      {“用户名”:“dunglas@example.com”,“密码”:“我的密码”}
  • 安全系统拦截请求,检查用户提交的凭证和对用户进行身份验证。如果凭证不正确,返回一个HTTP 401未经授权的JSON响应,否则控制器运行;
  • 控制器创建正确的反应:

    1 2 3 4
    {“用户”:“dunglas@example.com”,“令牌”:“45 be42……”}
  • 提示

    JSON请求的格式可以根据配置json_login关键。看到<一个href=”//www.oldmanjams.com/doc/6.0/reference/configuration/security.html" class="reference internal">安全配置引用(SecurityBundle)为更多的细节。

    < /div>

    HTTP基本身份验证是一个标准的HTTP身份验证框架。它要求凭据(用户名和密码)使用的浏览器和HTTP基本身份验证对话框Symfony将验证这些凭据。欧宝娱乐app下载地址

    添加http_basic关键你的防火墙启用HTTP基本身份验证:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8 9
    #配置/包/ security.yaml安全:#……防火墙:主要:#……http_basic:域:担保区域

    就是这样!每当一个未经身份验证的用户试图访问一个受保护页面,Symfony会告诉浏览器,它需要启动HTTP基本身份验证(使用欧宝娱乐app下载地址WWW-Authenticate响应头)。然后,身份验证凭证,对用户进行身份验证。

    请注意

    你不能使用<一个href=”//www.oldmanjams.com/doc/6.0/security.html" class="reference internal">注销HTTP基本身份验证。即使你从Symfony注销,您的浏览器“记住”您的欧宝娱乐app下载地址凭据,并将把他们在每一个请求。

    < /div>< /div>