表单登录< /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{#(路线(“/登录”,名字:“登录”))公共函数指数():响应{返回美元- >呈现(“登录/ 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:#“登录”的名字是先前创建的路线login_path:登录check_path:登录

    请注意

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

    < /div>

    一旦启用,安全系统重定向未经身份验证的游客login_path当他们试图访问一个安全的地方(这种行为可以定制<一个href=”//www.oldmanjams.com/doc/5.3/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{#[路线(“/登录”,名字:“登录”))公共函数指数():反应+公共函数指数(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%}<形式行动={{路径(“登录”)}}方法=“职位”><标签=“用户名”>电子邮件:< /标签><输入类型=“文本”id=“用户名”的名字=“_username”价值={{last_username}}/ ><标签=“密码”>密码:< /标签><输入类型=“密码”id=“密码”的名字=“_password”/ >{#如果你想控制用户的URL重定向到成功< input type = "隐藏" name =“_target_path”价值= " /帐户" / > #}<按钮类型=“提交”>登录< /按钮>< /形式>{%endblock%}
  • 谨慎

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

    < /div>

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

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

    提示

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

    < /div>

    谨慎

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

    < /div>

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

    回顾整个过程:

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

    另请参阅

    您可以自定义响应成功或失败的登录尝试。看到<一个href=”//www.oldmanjams.com/doc/5.3/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
    {/安全/ login.html #模板。树枝#}{#……#}<形式行动={{路径(“登录”)}}方法=“职位”>{#……登录字段#}<输入类型=“隐藏”的名字=“_csrf_token”价值={{csrf_token(验证)}}><按钮类型=“提交”>登录< /按钮>< /形式>

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

    提示

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

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

    < /div>

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

    请注意

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

    < /div>< /div>

    然后,使x认证者使用x509防火墙:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8 9
    #配置/包/ security.yaml安全:#……防火墙:主要:#……x509:供应商:your_user_provider

    默认情况下,Symfon欧宝娱乐app下载地址y中提取电子邮件地址的DN在两种不同的方式:

    1. 首先,它尝试SSL_CLIENT_S_DN_Email服务器参数,由Apache暴露;
    2. 如果不设置(如使用Nginx时),它使用SSL_CLIENT_S_DN和匹配的值emailAddress =

    你可以定制下这两个参数的名称x509关键。看到<一个href=”//www.oldmanjams.com/doc/5.3/security/reference/configuration/security.html" class="reference internal">配置引用为更多的细节。

    < /div>

    REMOTE_USER环境变量。远程用户身份验证使用该值作为用户标识符来加载对应的用户。

    使远程用户身份验证使用remote_user关键:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7
    #配置/包/ security.yaml安全:防火墙:主要:#……remote_user:供应商:your_user_provider

    提示

    您可以定制这个服务器变量下的名字remote_user关键。看到<一个href=”//www.oldmanjams.com/doc/5.3/security/reference/configuration/security.html" class="reference internal">配置引用为更多的细节。

    < /div>< /div>

    5.2

    登录节流是在Symfony 5.2中引入的。欧宝娱乐app下载地址

    < /div>

    欧宝娱乐app下载地址Symfony提供了基本的保护<一个href=”https://owasp.org/www-community/controls/Blocking_Brute_Force_Attacks" class="reference external" rel="external noopener noreferrer" target="_blank">蛮力登录攻击。你必须启用该使用login_throttling设置:

    • YAML
    • XML
    • PHP
    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日
    #配置/包/ security.yaml安全:#你必须使用身份验证管理器enable_authenticator_manager:真正的防火墙:#……主要:#……#默认情况下,该功能允许5每分钟登录尝试login_throttling:#配置最大登录尝试(每分钟)login_throttling:max_attempts:3#配置最大的登录尝试在一个自定义的时间内login_throttling:max_attempts:3间隔:“15分钟”#使用定制的速率限制器通过其服务IDlogin_throttling:限幅器:app.my_login_rate_limiter

    5.3

    login_throttling.interval选项是在Symfony 5.3中引入的。欧宝娱乐app下载地址

    < /div>

    默认情况下,登录尝试是有限的max_attempts(默认值:5)失败的请求IP地址+用户名5 * max_attempts请求失败IP地址。第二个限制防止攻击者绕过第一个极限使用多个用户名,在不影响正常用户大网络(如办公室)。

    提示

    限制失败的登录尝试只有一个基本保护蛮力攻击。的<一个href=”https://owasp.org/www-community/controls/Blocking_Brute_Force_Attacks" class="reference external" rel="external noopener noreferrer" target="_blank">OWASP蛮力攻击指南提到其他的保护,你应该考虑根据所需的保护级别。

    < /div>

    如果你需要一个更复杂的限制算法,创建一个类实现<一个href=”https://github.com/symfony/symfony/blob/5.3/src/Symfony/Component/HttpFoundation/RateLimiter/RequestRateLimiterInterface.php" class="reference external" title="RequestRateLimiterInterface”rel="external noopener noreferrer" target="_blank">RequestRateLimiterInterface(或使用<一个href=”https://github.com/symfony/symfony/blob/5.3/src/Symfony/Component/Security/Http/RateLimiter/DefaultLoginRateLimiter.php" class="reference external" title="DefaultLoginRateLimiter”rel="external noopener noreferrer" target="_blank">DefaultLoginRateLimiter)和设置限幅器选择其服务ID:

    • YAML
    • XML
    • PHP
    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
    #配置/包/ security.yaml框架:rate_limiter:#定义2速率限制器(一个用于用户名+ IP,另一个IP)username_ip_login:政策:token_bucket限制:5率:{间隔:“5分钟”}ip_login:政策:sliding_window限制:50间隔:“15分钟”服务:#我们的自定义登录率限制器app.login_rate_limiter:类:欧宝娱乐app下载地址Symfony \ \安全\ Http \ RateLimiter \ DefaultLoginRateLimiter组件参数:# globalFactory的限幅器IP$ globalFactory:“@limiter.ip_login”# localFactory的限幅器是用户名+ IP$ localFactory:“@limiter.username_ip_login”安全:防火墙:主要:#使用定制的速率限制器通过其服务IDlogin_throttling:限幅器:app.login_rate_limiter

    注销配置参数下防火墙:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8 9 10 11 12
    #配置/包/ security.yaml安全:#……防火墙:主要:#……注销:路径:app_logout#在注销后重定向#目标:app_any_route

    接下来,您需要创建一个路线这个URL(但不是一个控制器):

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    / / src /控制器/ SecurityController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\路由\注释\路线;SecurityController扩展AbstractController{/ * * *@Route(name = " /注销”“app_logout”方法={“获得”})* /公共函数注销():无效{/ /控制器可以空白:它永远不会叫!\异常(‘\ ' t忘记激活security.yaml注销”);}}

    就是这样!通过发送一个用户app_logout路线(即/注销Sy欧宝娱乐app下载地址mfony将un-authenticate当前用户重定向。

    5.1

    LogoutEvent是在Symfony 5.1中引入的。欧宝娱乐app下载地址在这个版本之前,你必须使用一个<一个href=”//www.oldmanjams.com/doc/5.3/security/reference/configuration/security.html" class="reference internal">注销成功处理程序定制注销。

    < /div>

    在某些情况下,您需要运行额外的逻辑在注销(例如一些令牌失效)或想定制注销后会发生什么。在注销,<一个href=”https://github.com/symfony/symfony/blob/5.3/src/Symfony/Component/Security/Http/Event/LogoutEvent.php" class="reference external" title="LogoutEvent”rel="external noopener noreferrer" target="_blank">LogoutEvent是派遣。注册一个<一个href=”//www.oldmanjams.com/doc/5.3/security/event_dispatcher.html" class="reference internal">事件监听器或用户自定义逻辑运行。以下信息是可用的事件类:

    getToken ()
    返回的会话的安全令牌将被注销。
    getRequest ()
    返回当前请求。
    getResponse ()
    返回一个响应,如果它已经由一个自定义侦听器。使用setResponse ()配置自定义注销的回应。

    用户当前用户可以访问的对象通过getUser ()的快捷方式<一个href=”//www.oldmanjams.com/doc/5.3/security/controller.html" class="reference internal">基本控制器:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
    使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\AbstractController;ProfileController扩展AbstractController{公共函数指数():响应{/ /通常你会首先要确保用户身份验证,/ /请参见下面的“授权”美元- >denyAccessUnlessGranted (“IS_AUTHENTICATED_FULLY”);/ /返回用户对象,或null如果用户没有进行身份验证/ /使用内联文档告诉你编辑欧宝体育电话你的精确的用户类/ * *@var实体\ App \ \用户用户* /美元美元用户=美元- >getUser ();/ /调用任何方法你添加到您的用户类/ /例如,如果你添加了一个getFirstName()方法,您可以使用。返回响应(“你好”美元用户- >getFirstName ());}}

    安全服务:

    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 /服务/ ExampleService.php/ /……使用欧宝娱乐app下载地址\组件\安全\核心\安全;ExampleService{私人美元安全;公共函数__construct(安全美元安全){/ /避免在构造函数中调用getUser():身份验证可能不会/ /完成。相反,整个安全存储对象。美元- >安全=美元安全;}公共函数someMethod(){/ /返回用户对象或null如果不是身份验证美元用户=美元- >安全- >getUser ();/ /……}}

    app.user由于变量<一个href=”//www.oldmanjams.com/doc/5.3/security/templates.html" class="reference internal">树枝全局应用程序变量:

    1 2 3
    {%如果is_granted (IS_AUTHENTICATED_FULLY) %}<p>电子邮件:{{app.user。电子邮件}}< /p>{%endif%}

  • 用户登录(如时收到一个特定的角色。ROLE_ADMIN)。
  • 你添加代码,这样一个资源(如URL,控制器)需要一个特定的“属性”(例如,一个角色ROLE_ADMIN)来访问。
  • 这是一个很好的违约,但你能做的无论你想要用户应该确定哪些角色。这里有一些指南:

    • 每一个角色必须从具备ROLE_(否则,事情无法正常工作)
    • 除了上面的规则,一个角色只是一个字符串,你可以创造你需要的(如。ROLE_PRODUCT_ADMIN)。

    您将使用这些角色授权访问旁边你的网站的特定部分。

    用户提供的ROLE_ADMIN也会有作用ROLE_USER的角色。用户提供ROLE_SUPER_ADMIN,会自动ROLE_ADMIN,ROLE_ALLOWED_TO_SWITCHROLE_USER(继承自ROLE_ADMIN)。

    谨慎

    角色层次结构来工作,不使用$ user - >将getRoles ()手动。例如,在一个扩展的控制器<一个href=”//www.oldmanjams.com/doc/5.3/security/controller.html" class="reference internal">基本控制器:

    1 2 3 4 5 6
    / /坏- $ user - >将getRoles()将不知道角色的层次结构美元hasAccess= in_array (“ROLE_ADMIN”,美元用户- >将getRoles ());/ /好——正常安全的使用方法美元hasAccess=美元- >isGranted (“ROLE_ADMIN”);美元- >denyAccessUnlessGranted (“ROLE_ADMIN”);

    请注意

    role_hierarchy值是静态的,你不能,例如,角色层次结构存储在一个数据库中。如果你需要创建一个定制的<一个href=”//www.oldmanjams.com/doc/5.3/security/security/voters.html" class="reference internal">安全选民查找数据库中的用户角色。

    < /div>

  • 在security.yaml access_control允许你保护URL模式(如。/管理/ *)。简单,灵活的更少;
  • 在你的控制器(或其他代码)
  • security.yaml。例如,要求ROLE_ADMIN开始的所有url/管理,您可以:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
    #配置/包/ security.yaml安全:#……防火墙:#……主要:#……access_control:#需要ROLE_ADMIN / admin *- - - - - -{路径:“^ /管理”,角色:ROLE_ADMIN}#或者需要ROLE_ADMIN或IS_AUTHENTICATED_FULLY / admin *- - - - - -{路径:“^ /管理”,角色:[IS_AUTHENTICATED_FULLY,ROLE_ADMIN]}#“路径”的值可以是任何有效的正则表达式#(这个匹配的url / api / post / 7298和/ api /评论/ 528491)- - - - - -{路径:^ / api / (post) |评论/ \ d + $,角色:ROLE_USER}

    你可以定义你需要尽可能多的URL模式——每一个正则表达式。,只有一个将匹配的每个请求:Symfony启动顶部的列表和停止当找到欧宝娱乐app下载地址第一个匹配:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8 9 10
    #配置/包/ security.yaml安全:#……access_control:# /管理/用户/ *匹配- - - - - -{路径:' ^ /管理/用户的,角色:ROLE_SUPER_ADMIN}#匹配/ admin / *除了任何匹配上述规则- - - - - -{路径:“^ /管理”,角色:ROLE_ADMIN}

    将路径与^意味着只有url开始模式匹配。例如,一个路径/管理(没有^)将匹配/管理/ foo但也会匹配的url/ foo /管理

    每一个access_control还可以匹配的IP地址、主机名和HTTP方法。它也可以用于将用户重定向到https版本的URL模式。看到<一个href=”//www.oldmanjams.com/doc/5.3/security/security/access_control.html" class="reference internal">安全access_control是如何工作的呢?

    1 2 3 4 5 6 7 8 9 10
    / / src /控制器/ AdminController.php/ /……公共函数adminDashboard():响应{美元- >denyAccessUnlessGranted (“ROLE_ADMIN”);/ /或添加一个可选的消息——被开发人员美元- >denyAccessUnlessGranted (“ROLE_ADMIN”,,用户试图访问一个页面没有ROLE_ADMIN”);}

    就是这样!如果不允许访问,特别<一个href=”https://github.com/symfony/symfony/blob/5.3/src/Symfony/Component/Security/Core/Exception/AccessDeniedException.php" class="reference external" title="AccessDeniedException”rel="external noopener noreferrer" target="_blank">AccessDeniedException是扔,没有更多的代码在你的控制器。然后,会发生两件事之一:

    1. 如果用户尚未登录,他们将被要求登录(如重定向到登录页面)。
    2. 如果用户登录,但是ROLE_ADMIN的角色,他们会显示403年拒绝访问页面(您可以<一个href=”//www.oldmanjams.com/doc/5.3/security/controller/error_pages.html" class="reference internal">定制)。

    由于SensioFrameworkExtraBundle,你也可以获得你的控制器使用注释:

    • 注释
    • 属性
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
    / / src /控制器/ AdminController.php/ /……使用Sensio赞助\\FrameworkExtraBundle\配置\IsGranted;/ * * *要求ROLE_ADMIN这个控制器* *的行为@IsGranted(“ROLE_ADMIN”) * /AdminController扩展AbstractController{/ * * *要求这一行动ROLE_SUPER_ADMIN只有* *@IsGranted(“ROLE_SUPER_ADMIN”) * /公共函数adminDashboard():响应{/ /……}}

    有关更多信息,请参见<一个href=”//www.oldmanjams.com/doc/current/bundles/SensioFrameworkExtraBundle/index.html" class="reference external">FrameworkExtraBundle文欧宝体育电话档

    is_granted ()辅助函数在任何树枝模板:

    1 2 3
    {%如果is_granted (ROLE_ADMIN) %}<一个href=“…”>删除< /一个>{%endif%}

    安全服务。例如,假设您有一个SalesReportManager服务和你想只有用户,包括额外的细节ROLE_SALES_ADMIN角色:

    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
    / / src / SalesReport / SalesReportManager。php / /……组件使用欧宝娱乐app下载地址Symfony \ \安全\ \例外\ AccessDeniedException核心;+使用Sym欧宝娱乐app下载地址fony核心组件\ \安全\ \安全;类SalesReportManager {美元+私人安全;+公共职能__construct(安全美元安全)+ {+ $ this - >安全= $安全;+}公共函数generateReport () {$ salesData = [];+如果($ this - >安全- > isGranted (ROLE_SALES_ADMIN)) {+ $ salesData [' top_secret_numbers '] = rand ();+}/ /……}/ /……}

    如果你使用<一个href=”//www.oldmanjams.com/doc/5.3/security/service_container.html" class="reference internal">默认的服务。yaml的配置,S欧宝娱乐app下载地址ymfony会自动通过security.helper由于自动装配和你的服务安全type-hint。

    您还可以使用较低级的<一个href=”https://github.com/symfony/symfony/blob/5.3/src/Symfony/Component/Security/Core/Authorization/AuthorizationCheckerInterface.php" class="reference external" title="AuthorizationCheckerInterface”rel="external noopener noreferrer" target="_blank">AuthorizationCheckerInterface服务。它一样安全,但允许type-hint更具体的接口。

    < /div>< /div>

    access_control规则。

    access_control配置,您可以使用PUBLIC_ACCESS安全属性排除一些线路未经身份验证的访问(例如,登录页面):

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8 9 10 11
    #配置/包/ security.yaml安全:enable_authenticator_manager:真正的#……access_control:#允许未经身份验证的用户访问登录表单- - - - - -{路径:^ / admin /登录,角色:PUBLIC_ACCESS}#但需要验证所有其他管理路线- - - - - -{路径:^ /管理,角色:ROLE_ADMIN}

    您可以使用IS_AUTHENTICATED_FULLY使用任何角色:喜欢access_control或者在树枝。

    IS_AUTHENTICATED_FULLY不是一个角色,但它就像一个,每个用户登录会有这个。实际上,有一些特殊的属性如下:

    • IS_AUTHENTICATED_REMEMBERED:所有登录用户,即使他们已登录,因为饼干“记住我”。即使你不使用<一个href=”//www.oldmanjams.com/doc/5.3/security/security/remember_me.html" class="reference internal">记得我的功能,您可以使用它来检查用户是否登录。
    • IS_AUTHENTICATED_FULLY:这是类似IS_AUTHENTICATED_REMEMBERED,但更强大。用户登录只因为“记住我饼干”IS_AUTHENTICATED_REMEMBERED但不会有IS_AUTHENTICATED_FULLY
    • IS_REMEMBERED:只有用户身份验证使用<一个href=”//www.oldmanjams.com/doc/5.3/security/security/remember_me.html" class="reference internal">记得我的功能记得我饼干,(即)。
    • IS_IMPERSONATOR:当当前用户<一个href=”//www.oldmanjams.com/doc/5.3/security/security/impersonating_user.html" class="reference internal">冒充另一个用户会话,这个属性会匹配。

    5.1

    IS_REMEMBEREDIS_IMPERSONATOR属性是在Symfony 5.1中引入的。欧宝娱乐app下载地址

    < /div>

    5.3

    IS_ANONYMOUSIS_AUTHENTICATED_ANONYMOUSLY属性是Symfony 5.3以来弃用。欧宝娱乐app下载地址

    < /div>

    无状态的),你用户对象序列化的会话。开始下一个请求,这是反序列化,然后传递给你的用户提供“刷新”(例如学说为新用户查询)。

    然后,这两个用户对象(原从会话和刷新用户对象)是“比较”,看看他们是“平等”。默认情况下,核心AbstractToken类比较的返回值getPassword (),getSalt ()getUserIdentifier ()方法。如果这些是不同的,您的用户将被注销。这是一个安全措施,以确保恶意用户可以de-authenticated如果核心用户数据的变化。

    然而,在某些情况下,这个过程会导致意想不到的认证问题。如果你有认证的问题,可能是你验证成功,但是你马上就会失去身份验证后第一个重定向。

    在这种情况下,审查序列化逻辑(例如。SerializableInterface)在你的用户类(如果你有),以确保所有必需的字段序列化。

    EquatableInterface。然后,你isEqualTo ()方法将调用当比较用户的核心逻辑。

    < /div>< /div>

    事件监听器或用户对于这些事件。

    提示

    每个安全防火墙都有自己的事件调度程序(security.event_dispatcher.FIREWALLNAME)。事件分派全球和firewall-specific调度员。你可以注册在防火墙调度程序,如果你想让你的听众只是要求一个特定的防火墙。例如,如果你有一个api主要防火墙,使用该配置只在注销事件注册主要防火墙:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8
    #配置/ services.yaml服务:#……App \ EventListener \ CustomLogoutSubscriber:标签:- - - - - -名称:kernel.event_subscriber调度员:security.event_dispatcher.main

    这项工作,包括代码示例,许可下<一个rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/">Creative Commons冲锋队3.0许可证。
    < /一个rticle>
    欧宝娱乐app下载地址Symfony 5.3是<一个href=”//www.oldmanjams.com/backers">支持通过<一个类=”link stretched-link" href="https://jolicode.com">JoliCode
    把代码质量的核心项目”>< /一个><p类=”highlight-symfony-text把代码质量的核心项目< /p>< /div> 测量和提高Symfony代码性能欧宝娱乐app下载地址”>< /一个><p类=”highlight-symfony-text测量和提高Symfony代码性能欧宝娱乐app下载地址< /p>< /div> 被训练SensioLabs专家(2到6天会议——法语或英语)。”>< /一个><p类=”highlight-symfony-text被训练SensioLabs专家(2到6天会议——法语或英语)。< /p>< /div>< /div>< /div>