安全

安全<一个阶级="headerlink" href="#security" title="¶">¶

截屏视频

你更喜欢视频教程吗?检查<一个阶级="reference external" href="https://symfonycasts.com/screencast/symfony-security">欧宝娱乐app下载地址Symfony安全屏幕直播系列

欧宝娱乐app下载地址Symfony的安全系统非常强大,但设置起来也会令人困惑。别担心!在本文中,您将学习如何设置应用程序的安全系统一步一步地:

  1. 安装安全支持
  2. 创建用户类
  3. 身份验证和防火墙
  4. 拒绝访问您的应用程序(授权)
  5. 获取当前User对象

之后还会讨论其他一些重要的话题。

1)安装<一个阶级="headerlink" href="#installation" title="¶">¶

在应用程序中使用<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/setup.html">欧宝娱乐app下载地址Symfony Flex,运行此命令安装安全特性后再使用:

1
作曲家需要symfony / se欧宝娱乐app下载地址curity-bundle

提示

一个<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/experimental_authenticators.html">新实验安全是在Symfony 5.1中引入的,欧宝娱乐app下载地址它最终将取代Symfony 6.0中的安全性。这个系统几乎完全向后兼容当前的Symfony安全,添加这一行到您的安全配置开始使用它:欧宝娱乐app下载地址

  • 亚马尔
    1 2 3 4
    #config/packages/security.yaml安全启用\u身份验证程序\u管理器真正的#……
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14
    <!--config/packages/security.xml--><?xml version = " 1.0 " encoding = " utf - 8 " ?>xmlns ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security"xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns: srv ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services"xsi:schemaLocation="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/securityhttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security/security-1.0.xsd">启用验证器管理器=“真正的”><!--...-->< / config >< / srv:容器>
  • PHP
    1 2 3 4 5 5
    / /配置/包/ security.php美元的容器->loadFromExtension“安全”“enable_authenticator_manager”=>真正的/ /……]);

2a)创建用户类<一个阶级="headerlink" href="#a-create-your-user-class" title="¶">¶

不管如何您将验证(例如登录表单或API令牌)或在哪里你的用户数据将被存储(数据库,单点登录),下一步总是相同的:创建一个“user”类。最简单的方法是使用<一个阶级="reference external" href="//www.oldmanjams.com/doc/current/bundles/SymfonyMakerBundle/index.html">马克本德尔

假设您希望使用以下命令将用户数据存储在数据库中:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
php bin /控制台:用户安全用户类的名称(例如user) [user]:>用户您想在数据库中存储用户数据(通过Doctrine)吗?(是/否)(是的):>对输入一个属性名称,它将是用户唯一的“显示”名称(例如:Email, username, uuid [Email]>电子邮件这个应用程序需要哈希/检查用户密码吗?(是/否)(是的):>对创建:src /实体/ User.php创建:src /仓库/ UserRepository.php更新:src/Entity/User.php更新:配置/包/ security.yaml

就是这样!该命令询问几个问题,以便能够生成您所需要的内容。最重要的是User.php文件本身。的只有规则对你使用者这是什么课必须实现欧宝娱乐app下载地址Symfony\Component\Security\Core\User\UserInterface.请随意添加任何你需要的其他领域或逻辑。如果你的使用者类是一个实体(如本例中所示),您可以使用<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/doctrine.html">:实体命令添加更多字段。同时,确保为新实体创建并运行迁移:

1 2
php bin /控制台:迁移php bin /控制台学说:迁移:迁移

2b)“用户提供者”<一个阶级="headerlink" href="#b-the-user-provider" title="¶">¶

除了你的使用者类,你还需要一个“用户提供程序”:一个帮助做一些事情的类,比如从会话中重新加载用户数据和一些可选特性,比如<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/remember_me.html">记得我和<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/impersonating_user.html">模拟

幸运的是,:用户命令中已经为您配置了一个安全.yaml提供者关键:

  • 亚马尔
    1 2 3 4 5 6 7 8 9 10
    #config/packages/security.yaml安全#……提供者#用于从会话和其他特性中重新加载用户(例如switch_user)应用程序\用户\提供商实体应用实体\ \用户财产电子邮件
  • XML
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    <!--config/packages/security.xml--><?xml版本="1.0"编码="UTF-8"xmlns ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security"xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns: srv ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services"xsi:schemaLocation="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><设置><!--使用d to reload user from session & other features (e.g. switch-user) --><供应商name =“app_user_provider”><实体阶级=“应用程序实体\ \用户”属性=“电子邮件”/>> < /供应商< / config >< / srv:容器>
  • PHP
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    / /配置/包/ security.php使用应用实体\ \用户美元的容器->loadFromExtension“安全”/ /……“供应商”=>//从session中重新加载user和其他特性(例如switch_user)“app_user_provider”=>“实体”=>“阶级”=>使用者::“属性”=>“电子邮件”],],],]);

如果你的使用者类是一个实体,您不需要执行任何其他操作。但是如果你的班级是一个实体,那么:用户还会生成一个用户提供者你需要完成的课程。在此了解更多关于用户供应商的信息:<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/user_provider.html">用户服务提供商

2 c)编码的密码<一个阶级="headerlink" href="#c-encoding-passwords" title="¶">¶

并不是所有的应用程序都有需要密码的“用户”。如果您的用户有密码,您可以控制这些密码的编码方式安全.yaml这个:用户命令将为您预先配置:

  • 亚马尔
    1 2 3 4 5 6 7 8 9 10
    #config/packages/security.yaml安全#……编码器#使用你的用户类名应用实体\ \用户#使用本机密码编码器,自动选择最佳密码#可能的哈希算法(从Symfony 5.3开始,这是“bcrypt”)欧宝娱乐app下载地址算法汽车
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
    <!--config/packages/security.xml--><?xml版本="1.0"编码="UTF-8"xmlns ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security"xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns: srv ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services"xsi:schemaLocation="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/securityhttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security/security-1.0.xsd"><设置><!--...--><编码器阶级=“应用程序实体\ \用户”算法=“自动”成本="12"/><!--...-->< / config >< / srv:容器>
  • PHP
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    / /配置/包/ security.php使用应用实体\ \用户美元的容器->loadFromExtension“安全”/ /……“编码器”=>使用者::=>“算法”=>“汽车”“成本”=>12],/ /……]);

现在Symfony欧宝娱乐app下载地址知道了如何如果你想对密码进行编码,可以使用UserPasswordEncoderInterface服务在将用户保存到数据库之前执行此操作。

例如,通过使用<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/testing.html">DoctrineFixturesBundle,可以创建虚拟数据库用户:

1 2 3 4
php bin /控制台:夹具要创建的装置的类名(例如AppFixture):> UserFixtures

使用此服务来编码密码:

12 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
/ / src / DataFixtures / UserFixtures.php+使用Sym欧宝娱乐app下载地址fony核心组件\ \安全\ \编码器\ UserPasswordEncoderInterface;/ /……类UserFixtures扩展了Fixture {+私人$passwordEncoder;+公共函数构造(UserPasswordEncoderface$passwordEncoder)+ {+ $this->passwordEncoder = $passwordEncoder;+}public function load(ObjectManager $manager) {$user = new user ();/ /……+ $ user - >向setPassword ($ this - > passwordEncoder - > encodePassword (+ $ user,+'新密码'+ ));/ /……} }

您可以通过运行以下命令手动编码密码:

1
php安全:bin /控制台encode-password

3a)身份验证和防火墙<一个阶级="headerlink" href="#a-authentication-firewalls" title="¶">¶

5.1新版功能:懒惰:真正的选项在Symfony 5.1中引入。欧宝娱乐app下载地址在5.1版本之前,它是使用匿名:懒惰的

安全系统配置在配置/包/ security.yaml这个大多数重要的部分是防火墙

  • 亚马尔
    1 2 3 4 5 6 7 8 9
    #config/packages/security.yaml安全防火墙dev图案^ /(_(分析器| wdt) | css |图片| js) /安全主要匿名的真正的懒惰的真正的
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
    <!--config/packages/security.xml--><?xml版本="1.0"编码="UTF-8"xmlns ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security"xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns: srv ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services"xsi:schemaLocation="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/securityhttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security/security-1.0.xsd"><设置><防火墙name =“开发人员”模式=“^/(124;(探查器| wdt)| css |图像| js)/”安全=“假”/><防火墙name =“主要”匿名=“真正的”懒惰的=“真正的”/>< / config >< / srv:容器>
  • PHP
    1 2 3 4 5 6 7 8 9 10 11 12 13
    / /配置/包/ security.php美元的容器->loadFromExtension“安全”“防火墙”=>“开发”=>“模式”=>' ^ /(_(分析器| wdt) | css |图片| js) / '“安全”=>],“主要”=>“匿名”=>真正的“懒”=>真正的],],]);

“防火墙”是您的身份验证系统:下面是它定义的配置如何你的用户将能够认证(例如登录表单,API令牌等)。

对于每个请求,只有一个防火墙是活动的:Symfony使用欧宝娱乐app下载地址图案键找到第一个匹配(你也可以<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/firewall_restriction.html">由主人或其他东西匹配).的dev防火墙实际上是一个假防火墙:它确保您不会意外地阻止Symfony的开发工具,这些工具位于URL下,如欧宝娱乐app下载地址/_剖析器/ _wdt

所有真正的控件处理url主要防火墙(不图案键表示它匹配所有URL)。防火墙可以有多种身份验证模式,换句话说,可以通过多种方式询问“你是谁?”。通常,当用户首次访问您的网站时,他们是未知的(即未登录)。这个匿名的模式,如果启用,将用于这些请求。

事实上,如果你现在去主页,你访问权限,您将看到您的“身份验证”为不久。这个firewall verified that it does not know your identity, and so, you are anonymous:

_images / anonymous_wdt.png

这意味着任何请求都可以使用匿名令牌访问某些资源,而某些操作(例如某些页面或按钮)仍然需要特定的特权。然后,用户可以访问一个表单登录,而不需要作为唯一用户进行身份验证(否则将发生一个无限重定向循环,要求用户在尝试这样做时进行身份验证)。

稍后您将学习如何拒绝访问某些url、控制器或模板的一部分。

提示

懒惰的如果不需要授权(即显式检查用户权限),匿名模式将阻止启动会话。这对于保持请求可缓存很重要(请参阅<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/http_cache.html">HTTP缓存).

请注意

如果没有看到工具栏,请安装<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/profiler.html">剖析器:

1
编写器需要——dev symfony/prof欧宝娱乐app下载地址iler-pack

现在我们了解了防火墙,下一步是创建一种用户身份验证的方法!

验证你的用户<一个阶级="headerlink" href="#b-authenticating-your-users" title="¶">¶

一开始,Symfony中的身份验证感欧宝娱乐app下载地址觉有点“神奇”。这是因为,比起创建一个路由和控制器来处理登录,你将激活一个身份验证提供者:一些自动运行的代码之前你的控制器被调用。

欧宝娱乐app下载地址Symfony有几个<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/auth_providers.html">内置的身份验证提供者. 如果您的用例与其中一个匹配完全,太好了!但是,在大多数情况下——包括登录表单——我们建议构建一个守卫身份验证器:允许进行控制的类每一个身份验证过程的一部分(请参阅下一节)。

提示

如果您的应用程序通过第三方服务(如谷歌、Facebook或Twitter(社交登录))记录用户登录,请查看<一个阶级="reference external" href="https://github.com/hwi/HWIOAuthBundle">HWIOAuthBundle欧宝下载链接社区包。

后卫的身份验证器<一个阶级="headerlink" href="#guard-authenticators" title="¶">¶

Guard验证器是一个提供给您完整的控制您的身份验证过程。有许多不同的方法来构建身份验证器;以下是一些常见的用例:

限制登录尝试<一个阶级="headerlink" href="#limiting-login-attempts" title="¶">¶

5.2新版功能:在Symfony 5.2中引入了登录限制。欧宝娱乐app下载地址

欧宝娱乐app下载地址Symfony提供基本的保护<一个阶级="reference external" href="https://owasp.org/www-community/controls/Blocking_Brute_Force_Attacks">暴力登录攻击如果你在用<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/experimental_authenticators.html">实验的身份验证器.您必须使用login_throttling设置:

  • 亚马尔
    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
    #config/packages/security.yaml安全启用\u身份验证程序\u管理器真正的防火墙#……主要#……#默认情况下,该功能允许每分钟5次登录尝试login_throttling#配置最大登录尝试次数(每分钟)login_throttling最大尝试次数3.#设置自定义时间段内的最大登录尝试次数login_throttling最大尝试次数3.时间间隔”15分钟的#通过服务ID使用自定义的费率限制器login_throttling限制器app.my_login_rate_limiter
  • XML
    12 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
    <!--config/packages/security.xml--><?xml version = " 1.0 " encoding = " utf - 8 " ?>xmlns ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security"xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns: srv ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services"xsi:schemaLocation="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/securityhttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security/security-1.0.xsd">启用验证器管理器=“真正的”><!--...--><防火墙name =“主要”><!--通过default, the feature allows 5 login attempts per minute -->< login-throttling / >< login-throttling最大尝试次数=“3”/><!--configure the maximum login attempts in a custom period of time -->< login-throttling最大尝试次数=“3”间隔=“15分钟”/><!--使用一个custom rate limiter via its service ID -->< login-throttling限制器=“应用程序。我的\u登录\u速率\u限制器”/>< /防火墙>< / config >< / srv:容器>
  • PHP
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
    / /配置/包/ security.php美元的容器->loadFromExtension“安全”“enable_authenticator_manager”=>真正的“防火墙”=>/ /……“主要”=>//默认情况下,该功能允许每分钟5次登录尝试“login_throttling”=>//设置最大登录次数“login_throttling”=>“max_attempts”=>3.],//设置自定义时间段内的最大登录次数“login_throttling”=>“max_attempts”=>3.“间隔”=>“15分钟”],],],]);

5.3新版功能:login_throttling.interval选项在Symfony 5.3中引入。欧宝娱乐app下载地址

默认情况下,限制登录尝试次数最大尝试次数(默认值:5)请求失败知识产权地址+用户名5最大尝试次数请求失败知识产权地址这个second limit protects against an attacker using multiple usernames from bypassing the first limit, without distrupting normal users on big networks (such as offices).

提示

限制失败的登录尝试只是针对暴力破解攻击的一种基本保护措施。的<一个阶级="reference external" href="https://owasp.org/www-community/controls/Blocking_Brute_Force_Attacks">OWASP暴力攻击指南提到了一些其他的保护措施,你应该根据所需的保护水平来考虑。

如果你需要一个更复杂的限制算法,创建一个类来实现欧宝娱乐app下载地址Symfony \ \ HttpFoundation \ RateLimiter \ RequestRateLimiterInterface组件(或使用欧宝娱乐app下载地址Symfony \ \安全\ Http \ RateLimiter \ DefaultLoginRateLimiter组件),并设置限制器其服务ID的选项:

  • 亚马尔
    12 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
    #config/packages/security.yaml框架rate_limiter#定义2个速率限制器(一个用于用户名+IP,另一个用于IP)用户名\u ip\u登录政策token_bucket限制5时间间隔“5分钟的ip_login政策滑动窗口限制50时间间隔”15分钟的服务#我们的自定义登录率限制app.login_rate_limiter欧宝娱乐app下载地址Symfony \ \安全\ Http \ RateLimiter \ DefaultLoginRateLimiter组件论据# globalFactory是IP的限制globalFactory美元“@limiter.ip_login”# localFactory是用户名+IP的限制localFactory美元“@limiter.username\u ip\u login”安全防火墙主要#通过服务ID使用自定义的费率限制器login_throttling限制器app.login_rate_limiter
  • XML
    12 34 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
    <!--config/packages/security.xml--><?xml version = " 1.0 " encoding = " utf - 8 " ?>xmlns ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security"xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xmlns: srv ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services"xsi:schemaLocation="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfonyhttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/securityhttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security/security-1.0.xsd"><框架:配置><框架:限速><!--define 2 rate limiters (one for username+IP, the other for IP) --><框架:限制器name =“username_ip_login”政策=“token_bucket”限制=“5”><框架:费率间隔=“5分钟”/>< /框架:限幅器><框架:限制器name =“ip_login”政策=“滑动窗口”限制=“50”间隔=“15分钟”/>< /框架:配置><!--our custom login rate limiter -->< srv:服务id =“app.login_rate_limiter”阶级=“欧宝娱乐app下载地址Symfony \组件\安全\ Http \ RateLimiter \ DefaultLoginRateLimiter”><!--1st argument is the limiter for IP -->< srv:论点类型=“服务”id =“限制器.ip_登录”/><!--2nd argument is the limiter for username+IP -->< srv:论点类型=“服务”id =“limiter.username_ip_login”/>< / srv:服务><设置><防火墙name =“主要”><!--使用一个custom rate limiter via its service ID -->< login-throttling限制器=“app.login_rate_limiter”/>< /防火墙>< / config >< / srv:容器>
  • PHP
    12 34 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
    / /配置/包/ security.php使用欧宝娱乐app下载地址Symfony \ DependencyInjection \ \组件参考使用欧宝娱乐app下载地址Symfony \ \安全\ Http \ RateLimiter \ DefaultLoginRateLimiter组件美元的容器->loadFromExtension“框架”“rate_limiter”=>//定义2个速率限制器(一个用于用户名+IP,另一个用于IP)“username_ip_login”=>“政策”=>“token_bucket”“限制”=>5“速度”=>“间隔”=>“5分钟”],],“ip_login”=>“政策”=>“sliding_window”“限制”=>50“间隔”=>“15分钟”],],]);美元的容器->注册“app.login_rate_limiter”DefaultLoginRateLimiter::->setArguments([//第一个参数是IP的限制参考'limiter.ip_登录'),//第二个参数是用户名+IP的限制参考“limiter.username_ip_login”),]);美元的容器->loadFromExtension“安全”“防火墙”=>“主要”=>//通过服务ID使用自定义费率限制器“login_throttling”=>“限制器”=>“app.login_rate_limiter”],],],]);

4)拒绝访问、角色和其他授权<一个阶级="headerlink" href="#denying-access-roles-and-other-authorization" title="¶">¶

用户现在可以使用您的登录表单登录到您的应用程序。伟大的现在,您需要学习如何拒绝访问并使用User对象。这叫做授权,它的工作是决定用户是否可以访问某些资源(URL、模型对象、方法调用等等)。

授权的过程有两个不同的方面:

  1. 用户在登录时接收一组特定的角色(例如:ROLE_ADMIN).
  2. 添加代码使资源(例如URL、控制器)需要一个特定的“属性”(通常是像ROLE_ADMIN)以供访问。

角色<一个阶级="headerlink" href="#roles" title="¶">¶

当用户登录时,Symfony调用欧宝娱乐app下载地址getRoles()方法在你的使用者对象以确定该用户具有哪些角色。在使用者类,角色是存储在数据库中的数组,每个用户都是总是至少有一个角色:ROLE_USER

/ / src /实体/ User.php/ /……使用者/*** @ORM \列(type = " json ")*/私人美元的角色[];/ /……平民的函数将getRoles()大堆美元的角色这个美元->角色//保证每个用户至少有ROLE_USER美元的角色[]“角色\用户”返回数组_唯一美元的角色);

这是一个很好的默认值,但您可以这样做无论什么您想确定用户应该具有哪些角色。以下是一些指导原则:

  • 每一个角色必须从具备ROLE_(否则,事情不会像预期的那样运行)
  • 除了上面的规则,角色只是一个字符串,你可以发明你需要的东西(例如。ROLE_PRODUCT_ADMIN).

接下来将使用这些角色授予对站点特定部分的访问权。你也可以用a<一个阶级="reference internal" href="#security-role-hierarchy">角色层次结构有些角色会自动赋予你其他角色。

添加拒绝访问的代码<一个阶级="headerlink" href="#add-code-to-deny-access" title="¶">¶

两个拒绝访问某物的方法:

  1. 在security.yaml access_control允许您保护URL模式(例如:/管理/ *).更简单,但不太灵活;
  2. 在控制器(或其他代码)中

保护URL模式(access_control)<一个阶级="headerlink" href="#securing-url-patterns-access-control" title="¶">¶

保护应用程序部分的最基本方法是保护整个URL模式安全.yaml.例如,要求ROLE_ADMIN所有以/管理,你可以:

  • 亚马尔
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
    #config/packages/security.yaml安全#……防火墙#……主要#……访问控制# /admin / ROLE_ADMIN-路径“^ /管理”角色ROLE_ADMIN# or require ROLE_ADMIN or is_authenticated_full for /admin*-路径“^ /管理”角色IS_AUTHENTICATED_FULLYROLE_ADMIN#“path”值可以是任何有效的正则表达式/api/post/7298和/api/comment/528491-路径^ / api / (post) |评论/ \ d + $角色ROLE_USER
  • XML
    12 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
    <!--config/packages/security.xml--><?xml版本="1.0"编码="UTF-8"xmlns ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security"xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns: srv ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services"xsi:schemaLocation="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/securityhttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security/security-1.0.xsd"><设置><!--...--><防火墙name =“主要”><!--...-->< /防火墙><!--require ROLE_ADMIN for /admin* --><规则路径=“^ /管理”角色=“ROLE_ADMIN”/><规则路径=“^ /管理”>< >角色ROLE_ADMIN> < /角色< >角色IS_AUTHENTICATED_FULLY> < /角色> < /规则<!--the 'path' value can be any valid regular expression(这个将匹配url /api/post/7298和/api/comment/528491)——><规则路径=“^ / api / (post |评论)/ \ d + $”角色=“ROLE_USER”/>< / config >< / srv:容器>
  • PHP
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
    / /配置/包/ security.php美元的容器->loadFromExtension“安全”/ /……“防火墙”=>/ /……“主要”=>/ /……],],“access_control”=>//需要/ADMIN的角色\u ADMIN*“路径”=>“^ /管理”“角色”=>“ROLE_ADMIN”],//需要ROLE_ADMIN或is_authenticated_full“路径”=>“^ /管理”“角色”=>“ROLE_ADMIN”“IS_AUTHENTICATED_FULLY”]],// path的值可以是任何有效的正则表达式//(这个将匹配url /api/post/7298和/api/comment/528491)“路径”=>' ^ / api / (post) |评论/ \ d + $ '“角色”=>“角色\用户”],],]);

您可以定义任意多的URL模式—每个模式都是一个正则表达式。,只有一个Symfony从列表的顶部开始,当它找到第一个匹配时停止:欧宝娱乐app下载地址

  • 亚马尔
    1 2 3 4 5 6 7 8 9 10
    #config/packages/security.yaml安全#……访问控制# /管理/用户/ *匹配-路径' ^ /管理/用户的角色角色超级管理员# matches /admin/*除了匹配上述规则的内容-路径“^ /管理”角色ROLE_ADMIN
  • XML
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    <!--config/packages/security.xml--><?xml版本="1.0"编码="UTF-8"xmlns ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security"xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns: srv ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services"xsi:schemaLocation="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/securityhttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security/security-1.0.xsd"><设置><!--...--><规则路径=“^ /管理/用户”角色=“ROLE_SUPER_ADMIN”/><规则路径=“^ /管理”角色=“ROLE_ADMIN”/>< / config >< / srv:容器>
  • PHP
    1 2 3 4 5 6 7 8 9
    / /配置/包/ security.php美元的容器->loadFromExtension“安全”/ /……“access_control”=>“路径”=>' ^ /管理/用户的“角色”=>“角色超级管理员”],“路径”=>“^ /管理”“角色”=>“ROLE_ADMIN”],],]);

意味着只有url开始与图案相匹配。例如,的路径/管理(没有)将匹配/管理/ foo但也会匹配url/ foo /管理

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

安全控制器和其他代码<一个阶级="headerlink" href="#securing-controllers-and-other-code" title="¶">¶

您可以拒绝控制器内部的访问:

/ / src /控制器/ AdminController.php/ /……平民的函数adminDashboard()回答这个美元->denyAccessUnlessGranted“ROLE_ADMIN”);//或者添加一个可选的消息-被开发人员看到这个美元->denyAccessUnlessGranted“ROLE_ADMIN”'用户试图在没有角色\u ADMIN的情况下访问页面');

就是这样!如果没有授予访问权限,则使用特殊的欧宝娱乐app下载地址Symfony \ \安全\ \例外\ AccessDeniedException核心组件抛出,并且不再调用控制器中的代码。然后,将发生以下两种情况之一:

  1. 如果用户尚未登录,将要求他们登录(例如重定向到登录页面)。
  2. 如果用户已登录,但没有ROLE_ADMIN角色,它们将显示403访问拒绝页面(您可以<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/controller/error_pages.html">定制).

多亏了SensioFrameworkExtraBundle,你还可以使用注释来保护你的控制器:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// src/Controller/AdminController.php //…+使用Sensio赞助\包\ FrameworkExtraBundle \ \ IsGranted配置;+ / * *在这个类中,每个控制器方法都需要ROLE_ADMIN。+ *+ * @IsGranted(“ROLE_ADMIN”)+ * /类AdminController扩展了AbstractController {+ / * *+*仅此控制器方法需要角色\u ADMIN。+ *+ * @IsGranted(“ROLE_ADMIN”)+ * /public function adminDashboard(): Response{//…} }

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

模板中的访问控制<一个阶级="headerlink" href="#access-control-in-templates" title="¶">¶

如果要检查当前用户是否具有某个角色,可以使用内置的is_granted ()在任何Twig模板中的helper函数:

1 2 3
{%如果你同意吗“ROLE_ADMIN”%}<一个href"...">删除一个>{%endif%}

获得其他服务<一个阶级="headerlink" href="#securing-other-services" title="¶">¶

看到<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/securing_services.html">如何保护应用程序中的任何服务或方法

设置个人用户权限<一个阶级="headerlink" href="#setting-individual-user-permissions" title="¶">¶

大多数应用程序需要更具体的访问规则。例如,用户应该只能编辑他们的拥有博客上的评论。选民允许你写作无论什么业务逻辑需要确定访问权限。使用这些投票者类似于前面章节中实现的基于角色的访问检查。读<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/voters.html">如何使用投票者检查用户权限学习如何实现您自己的投票人。

检查用户是否已登录(是否已完全验证)<一个阶级="headerlink" href="#checking-to-see-if-a-user-is-logged-in-is-authenticated-fully" title="¶">¶

如果你只有想要检查用户是否已经登录(您不关心角色),有两个选项。首先,如果你给了每一个用户ROLE_USER,您可以检查该角色。否则,你可以使用一个特殊的“属性”来代替角色:

/ /……平民的函数adminDashboard()回答这个美元->denyAccessUnlessGranted“IS_AUTHENTICATED_FULLY”);/ /……

您可以使用IS_AUTHENTICATED_FULLY任何使用角色的地方:比如访问控制或者在树枝。

IS_AUTHENTICATED_FULLY不是一个角色,但它的行为有点像一个角色,每个登录的用户都会有这个。实际上,有一些像这样的特殊属性:

  • 你还记得吗所有登录的用户有这个,即使他们登录是因为一个“记住我的cookie”。即使你不使用<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/remember_me.html">记得我的功能,您可以使用它来检查用户是否已登录。
  • IS_AUTHENTICATED_FULLY这是类似的你还记得吗,但更强。仅因“记住我cookie”而登录的用户将你还记得吗但不会有IS_AUTHENTICATED_FULLY
  • IS_AUTHENTICATED_ANONYMOUSLY所有用户(甚至是匿名用户)都有这样的功能——这在以下情况下非常有用白名单url保证访问-一些细节<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/access_control.html">安全access_control如何工作?
  • 你是匿名的吗只有匿名用户通过此属性进行匹配。
  • IS_REMEMBERED只有使用<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/remember_me.html">记得我的功能,(即“勿忘我”饼干)。
  • IS_IMPERSONATOR:当前用户为<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/impersonating_user.html">冒充此会话中的另一个用户,此属性将匹配。

5.1新版功能:你是匿名的吗IS_REMEMBEREDIS_IMPERSONATOR属性是在Symfony 5.1中引入的。欧宝娱乐app下载地址

5a)获取用户对象<一个阶级="headerlink" href="#a-fetching-the-user-object" title="¶">¶

身份验证后,使用者对象的getUser ()快捷方式:

平民的函数指数()回答//通常你会想要确保用户是首先通过身份验证的这个美元->denyAccessUnlessGranted“IS_AUTHENTICATED_FULLY”);//返回User对象,如果用户没有通过身份验证,则返回null//使用内联文档告诉编辑器确欧宝体育电话切的User类/** @var \App\Entity\User $ User */$ user这个美元->getUser();//调用添加到User类中的任何方法//例如,如果你添加了一个getFirstName()方法,你可以使用它。返回回答"你好"$ user->getFirstName());

从服务中获取用户<一个阶级="headerlink" href="#b-fetching-the-user-from-a-service" title="¶">¶

如果需要从服务获取登录用户,请使用欧宝娱乐app下载地址Symfony\Component\Security\Core\Security服务:

/ / src /服务/ ExampleService.php/ /……使用欧宝娱乐app下载地址Symfony\Component\Security\Core\SecurityExampleService私人美元的安全平民的函数__construct安全美元的安全//避免在构造函数中调用getUser(): auth可能不会//尚未完成。相反,存储整个Security对象。这个美元->安全美元的安全平民的函数某种方法()//返回User对象,如果没有验证则返回null$ user这个美元->安全->getUser();/ /……

在模板中获取用户<一个阶级="headerlink" href="#fetch-the-user-in-a-template" title="¶">¶

在Twig模板中,用户对象可以通过app.user变量,感谢<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/templates.html">Twig全局应用变量

1 2 3
{%如果你同意吗“IS_AUTHENTICATED_FULLY”%}<p>电邮:{{app.user.email}}p>{%endif%}

注销<一个阶级="headerlink" href="#logging-out" title="¶">¶

要启用注销,请激活注销在防火墙下配置参数:

  • 亚马尔
    12 3 4 5 6 7 8 9 10 11 12
    #config/packages/security.yaml安全#……防火墙主要#……注销路径app_logout#注销后重定向到哪里#目标:app_any_route
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
    <!--config/packages/security.xml--><?xml版本="1.0"编码="UTF-8"xmlns ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security"xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns: srv ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services"xsi:schemaLocation="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/securityhttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security/security-1.0.xsd"><设置><!--...--><防火墙name =“secured_area”><!--...--><注销路径=“app_logout”/>< /防火墙>< / config >< / srv:容器>
  • PHP
    1 2 3 4 5 6 7 8 9 10 11
    / /配置/包/ security.php美元的容器->loadFromExtension“安全”/ /……“防火墙”=>“secured_area”=>/ /……“注销”=>“路径”=>“app_logout”],],],]);

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

  • 注释
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    / / src /控制器/ SecurityController.php名称空间App \控制器使用欧宝娱乐app下载地址Symfony \包\ FrameworkBundle \ \ AbstractController控制器使用欧宝娱乐app下载地址Symfony组件\ \路由\注释\路线安全控制器扩展AbstractController/*** @Route(“/注销”,name = " app_logout "方法={“获得”})*/平民的函数注销()无效//控制器可以为空:它将永远不会被执行!\例外'别忘了在security.yaml中激活登出');
  • 属性
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    / / src /控制器/ SecurityController.php名称空间App \控制器使用欧宝娱乐app下载地址Symfony \包\ FrameworkBundle \ \ AbstractController控制器使用欧宝娱乐app下载地址Symfony组件\ \路由\注释\路线安全控制器扩展AbstractController#(路线(“/注销”,名字:“app_logout”,方法:[的]))平民的函数注销()//控制器可以为空:它将永远不会被执行!\例外'别忘了在security.yaml中激活登出');
  • 亚马尔
    1 2 3 4
    #配置/ routes.yamlapp_logout路径/注销方法收到
  • XML
    1 2 3 4 5 6 7 8 9
    <!--config/routes.xml --><?xml版本="1.0"编码="UTF-8"<路线xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”xsi:schemaLocation="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routinghttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id =“app_logout”路径=“/注销”方法=“获得”/>
  • PHP
    1 2 3 4 5 6 7 8
    / /配置/ routes.php使用欧宝娱乐app下载地址Symfony \路由\装载机\ \组件配置器\ RoutingConfigurator返回函数RoutingConfigurator美元的路线美元的路线->添加“app_logout”/注销的->方法([“得到”])};

这是它!通过将用户发送到app_logout路线(即/注销)S欧宝娱乐app下载地址ymfony将取消对当前用户的身份验证并重定向他们。

定制注销<一个阶级="headerlink" href="#customizing-logout" title="¶">¶

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

在某些情况下,您需要在注销时执行额外的逻辑(例如,使某些令牌无效),或者希望自定义注销后发生的情况。注销期间,会出现欧宝娱乐app下载地址Symfony组件\ \安全\ Http \ \ LogoutEvent事件是派遣。注册一个<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/event_dispatcher.html">事件侦听器或订阅者执行自定义逻辑。以下信息可在事件类:

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

提示

每个安全防火墙都有自己的事件分配器(security.event_dispatcher.FIREWALLNAME).登出事件在全局和防火墙分配器上都被分派。如果您希望侦听器只针对特定的防火墙执行,则可以在防火墙分配器上注册。例如,如果你有api主要中,使用此配置仅在注销事件时注册主要防火墙:

  • 亚马尔
    1 2 3 4 5 6 7 8
    #配置/ services.yaml服务#……App \ EventListener \ CustomLogoutSubscriber标签-名称kernel.event_subscriber调度程序security.event_dispatcher.main
  • XML
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    <?xml版本="1.0"编码="UTF-8"<容器xmlns ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services"xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”xsi:schemaLocation="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><!--...--><服务id =“应用程序\EventListener\CustomLogoutSubscriber”><标签name =“kernel.event_subscriber”dispacher =“security.event_dispatcher.main”/>< /服务>> < /服务> < /容器
  • PHP
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    / /配置/ services.php名称空间欧宝娱乐app下载地址Symfony \ DependencyInjection \装载机\ \组件配置器使用App \ EventListener \ CustomLogoutListener使用App \ EventListener \ CustomLogoutSubscriber使用欧宝娱乐app下载地址Symfony组件\ \安全\ Http \ \ LogoutEvent事件返回函数ContainerConfigurator美元配置器美元服务美元配置器->服务();美元服务->CustomLogoutSubscriber::->标签'kernel.event_订阅者'“调度”=>“security.event_dispatcher.main”]);};

层次的角色<一个阶级="headerlink" href="#hierarchical-roles" title="¶">¶

你可以通过创建角色层次来定义角色继承规则,而不是给每个用户分配多个角色:

  • 亚马尔
    1 2 3 4 5 6 7
    #config/packages/security.yaml安全#……role_hierarchyROLE_ADMINROLE_USER角色超级管理员ROLE_ADMIN角色\u允许\u到\u切换
  • XML
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    <!--config/packages/security.xml--><?xml版本="1.0"编码="UTF-8"xmlns ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security"xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns: srv ="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services"xsi:schemaLocation="http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/serviceshttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/securityhttps://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security/security-1.0.xsd"><设置><!--...--><角色id =“ROLE_ADMIN”>ROLE_USER> < /角色<角色id =“ROLE_SUPER_ADMIN”>ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH> < /角色< / config >< / srv:容器>
  • PHP
    12 3 4 5 6 7 8 9 10 11 12
    / /配置/包/ security.php美元的容器->loadFromExtension“安全”/ /……“role_hierarchy”=>“ROLE_ADMIN”=>“角色\用户”“角色超级管理员”=>“ROLE_ADMIN”“ROLE_ALLOWED_TO_SWITCH”],],]);

用户提供的ROLE_ADMIN角色也会有ROLE_USER角色以及角色超级管理员,将自动具有ROLE_ADMIN角色\u允许\u到\u切换ROLE_USER(继承自ROLE_ADMIN).

要想让角色层级发挥作用,不要尝试打电话用户- >将getRoles ()手动。例如,在控制器扩展<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/controller.html">基本控制器

// BAD - $user->getRoles()将不知道角色层次结构$hasAccessin_array“ROLE_ADMIN”$ user->将getRoles());// GOOD -使用正常的安全方法$hasAccess这个美元->isGranted“ROLE_ADMIN”);这个美元->denyAccessUnlessGranted“ROLE_ADMIN”);

请注意

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

常见问题<一个阶级="headerlink" href="#frequently-asked-questions" title="¶">¶

我可以有多个防火墙吗?
是的!但这通常是不必要的。每个防火墙就像一个独立的安全系统。所以,除非你有非常不同的身份验证需求,一个防火墙通常工作良好。与<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/guard_authentication.html">后卫的身份验证,您可以创建各种不同的方式来允许在同一防火墙下进行身份验证(例如表单登录、API密钥身份验证和LDAP)。
防火墙之间是否可以共享认证?
是的,但只有一些配置。如果您使用多个防火墙,并且您针对一个防火墙进行身份验证,您将自动针对任何其他防火墙进行身份验证。不同的防火墙就像不同的安全系统。为此,必须显式指定相同的<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/reference/configuration/security.html">防火墙上下文对于不同的防火墙。但通常对于大多数应用程序来说,有一个主防火墙就足够了。
安全似乎在我的错误页面上不起作用
当路由完成时之前安全性方面,404错误页面不被任何防火墙覆盖。这意味着您无法检查安全性,甚至无法访问这些页面上的用户对象。看见<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/controller/error_pages.html">如何自定义错误页面为更多的细节。
我的身份验证似乎不起作用:没有错误,但我从未登录
有时身份验证可能会成功,但重定向之后,由于在加载使用者从会话。要查看是否有问题,请检查日志文件(var / log / dev.log)以获取日志信息:
无法刷新令牌,因为用户已更改
如果你看到这个,有两个可能的原因。首先,从会话加载用户时可能出现问题。看到<一个阶级="reference internal" href="//www.oldmanjams.com/doc/5.3/security/user_provider.html">了解如何从会话刷新用户.其次,如果自上次页面刷新以来数据库中的某些用户信息发生了更改,Symfony将出于安全原因故意注销该用户。欧宝娱乐app下载地址

这个工作,包括代码示例,是根据<一个rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/">知识共享BY-SA 3.0许可证。