这个用户提供者知道如何(重新)从一个存储加载用户(例如,数据库)基于“用户标识符”(如用户的电子邮件地址或用户名)。上面的配置使用原则来加载用户实体使用电子邮件属性为“用户标识符”。

用户在几个地方使用提供者在安全生命周期:

加载用户基于一个标识符
在登录(或任何其他身份验证),提供商加载用户基于用户标识符。一些其他特性,比如<一个href=”//www.oldmanjams.com/doc/current/security/security/impersonating_user.html" class="reference internal">用户模拟和<一个href=”//www.oldmanjams.com/doc/current/security/security/remember_me.html" class="reference internal">记得我也用这个。
重新加载用户的会话
在每个请求的开始,从会话用户加载(除非你的防火墙无状态的)。提供者“刷新”用户(例如数据库查询了最新数据),以确保所有用户的信息是最新的(如果必要,用户de-authenticated /记录如果有改变)。看到<一个href=”//www.oldmanjams.com/doc/current/security/security.html" class="reference internal">安全关于这个过程的更多信息。

欧宝娱乐app下载地址Symfony提供了几个内置的用户提供者:

实体用户提供者< /dt>
从数据库加载用户使用<一个href=”//www.oldmanjams.com/doc/current/security/doctrine.html" class="reference internal">学说;
LDAP用户提供者< /dt>
从LDAP服务器加载用户;
记忆用户提供者< /dt>
加载用户配置文件;
链用户提供者< /dt>
合并两个或两个以上的用户提供一个新的用户提供者。因为每个防火墙完全一个用户提供者,您可以使用此链多个提供者在一起。

内置的用户提供涵盖最常见的应用程序需求,但是你还可以创建自己的<一个href=”//www.oldmanjams.com/doc/current/security/security/user_providers.html" class="reference internal">定制用户提供者

请注意

有时,您需要将用户提供者在另一个类(例如,在您的自定义身份验证)。所有用户提供者遵循这种模式的服务ID:security.user.provider.concrete。< your-provider-name >(< your-provider-name >配置是关键。app_user_provider)。如果你只有一个用户提供者,您可以使用自动装配<一个href=”https://github.com/symfony/symfony/blob/6.2/src/Symfony/Component/Security/Core/User/UserProviderInterface.php" class="reference external" title="UserProviderInterface”rel="external noopener noreferrer" target="_blank">UserProviderInterface类型- - - - - -hint。

< /div>

然后,配置哪些密码侍者应该用于这类。如果你的security.yaml文件不是已经预先配置,然后:用户你应该这样做:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
#配置/包/ security.yaml安全:#……password_hashers:#使用本机密码切肉机,自动选择和迁移最好的#可能散列算法(目前是“bcrypt”)欧宝娱乐app下载地址Symfony \ \安全\ \用户\ PasswordAuthenticatedUserInterface核心组件:“汽车”

现在,Symfon欧宝娱乐app下载地址y知道如何你想哈希密码,您可以使用UserPasswordHasherInterface服务之前保存你的用户数据库:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
/ / src /控制器/ RegistrationController.php名称空间应用程序\控制器;/ /……使用欧宝娱乐app下载地址\组件\PasswordHasher\切肉机\UserPasswordHasherInterface;RegistrationController扩展AbstractController{公共函数指数(UserPasswordHasherInterface美元passwordHasher){/ /……如从一个注册表单获取用户数据美元用户=用户(…);美元plaintextPassword=……;/ /散列(基于安全的密码。yaml配置为$ user类)美元hashedPassword=美元passwordHasher- >hashPassword (美元用户,美元plaintextPassword);美元用户- >向setPassword (美元hashedPassword);/ /……}}

提示

:注册表单制造商命令可以帮助你设置注册控制器和添加功能,如电子邮件地址验证使用<一个href=”https://github.com/symfonycasts/verify-email-bundle" class="reference external" rel="external noopener noreferrer" target="_blank">欧宝娱乐app下载地址SymfonyCastsVerifyEmailBundle

1 2
美元作曲家需要symfonycasts欧宝娱乐app下载地址 / verify-email-bundle美元php bin /控制台:登记表

你也可以手动哈希密码通过运行:

1
美元php bin /控制台安全:哈希密码

阅读更多关于移民所有可用的侍者和密码<一个href=”//www.oldmanjams.com/doc/current/security/security/passwords.html" class="reference internal">密码散列和验证

6.2

在应用程序中使用Symfony 6.2和PH欧宝娱乐app下载地址P 8.2或更新版本,<一个href=”https://wiki.php.net/rfc/redact_parameters_in_back_traces" class="reference external" rel="external noopener noreferrer" target="_blank">SensitiveParameter PHP属性是应用于所有普通密码和敏感的令牌,所以他们不会出现在堆栈跟踪。

< /div>

防火墙的部分配置/包/ 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/current/security/security/firewall_restriction.html" class="reference internal">比赛由主机或其他的东西)。

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

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

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

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

提示

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

< /div>

请注意

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

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

6.2

getFirewallConfig ()方法是在Symfony 6.2中引入的。欧宝娱乐app下载地址

< /div>

表单登录< /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/current/security/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 " value = " /账户”> #}<按钮类型=“提交”>登录< /按钮>< /形式>{%endblock%}
  • 谨慎

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

    < /div>

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

    • <形式>发送一个元素帖子请求app_login路线,因为那是你的配置check_pathform_login关键在security.yaml;
    • 用户名(或者无论你用户的“标识符”,像电子邮件)字段的名称_username和密码字段的名称_password

    提示

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

    < /div>

    谨慎

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

    < /div>

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

    回顾整个过程:

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

    另请参阅

    您可以自定义响应成功或失败的登录尝试。看到<一个href=”//www.oldmanjams.com/doc/current/security/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/current/security/reference/configuration/security.html" class="reference internal">安全配置引用(SecurityBundle)为更多的细节。

    < /div>

    请注意

    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.2/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/current/security/reference/configuration/security.html" class="reference internal">安全配置引用(SecurityBundle)为更多的细节。

    < /div>

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

    请注意

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

    < /div>< /div>
    检查代码的性能在开发、测试、分期和生产”>< /一个><p类=”highlight-symfony-text检查代码的性能在开发、测试、分期和生产< /p>< /div> 被训练SensioLabs专家(2到6天会议——法语或英语)。”>< /一个><p类=”highlight-symfony-text被训练SensioLabs专家(2到6天会议——法语或英语)。< /p>< /div>< /div>< /div>