安全
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。
安全
欧宝娱乐app下载地址Symfony提供了很多工具来确保您的应用程序。一些与http有关的安全工具,比如安全会话cookie和CSRF保护在默认情况下提供。SecurityBundle,您将了解在本指南,提供所有身份验证和授权功能需要确保您的应用程序。
首先,安装SecurityBundle:
1
美元作曲家需要symfony / se欧宝娱乐app下载地址curity-bundle
如果你有欧宝娱乐app下载地址Symfony Flex安装,这也创造了一个security.yaml
为你配置文件:
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
#配置/包/ security.yaml安全:enable_authenticator_manager:真正的# https://欧宝娱乐app下载地址www.oldmanjams.com/doc/current/security.html c-hashing-passwordspassword_hashers:欧宝娱乐app下载地址Symfony \ \安全\ \用户\ PasswordAuthenticatedUserInterface核心组件:“汽车”# https://欧宝娱乐app下载地址www.oldmanjams.com/doc/current/security.html where-do-users-come-from-user-providers提供者:users_in_memory:{记忆:零}防火墙:戴夫:模式:^ /(_(分析器| wdt) | css |图片| js) /安全:假主要:懒惰:真正的供应商:users_in_memory#激活不同的方式进行身份验证# https://欧宝娱乐app下载地址www.oldmanjams.com/doc/current/security.html firewalls-authentication# https://欧宝娱乐app下载地址www.oldmanjams.com/doc/current/security/impersonating_user.html# switch_user:真#大部分的简单的方法来控制访问你的网站#注意:只有第一* *将使用访问控制相匹配access_control:#——{路径:^ / admin角色:ROLE_ADMIN}# -{路径:^ /形象,角色:ROLE_USER}
这是一个很多配置!在接下来的部分中,讨论了三个主要的元素:
-
用户(
供应商
) - 任何担保部分的应用程序需要一些用户的概念。用户从任何提供者加载用户存储(例如,数据库)基于“用户标识符”(例如用户的电子邮件地址);
-
防火墙&用户身份验证(
防火墙
) - 防火墙是保护您的应用程序的核心。每个请求防火墙内检查是否需要一个身份验证的用户。防火墙还负责对该用户进行身份验证(例如使用登录表单);
-
访问控制(授权)(
access_control
) - 使用访问控制和授权检查,您控制所需的权限来执行特定的操作或访问一个特定的URL。
谨慎
欧宝娱乐app下载地址Symfony 5.3安全收到了重大变化。本文解释了新authenticator-based系统(确定的enable_authenticator_manager:真
配置选项)。
指的是5.2版本的文档欧宝体育电话如果你仍然使用遗留安全系统。
用户
权限在Symfony总是与一个欧宝娱乐app下载地址用户对象。如果你需要确保应用程序(部分),您需要创建一个用户类。这是一个类,它实现了用户界面。这常常是一个学说的实体,但您还可以使用一个专用的安全用户类。
生成一个用户类的最简单方法是使用:用户
命令从MakerBundle:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
美元php bin /控制台:用户安全用户类的名称(例如用户)[用户]:>用户你想存储用户数据在数据库(通过学说)吗?(yes / no)[是]:>是的输入属性名称将是独一无二的“显示”的名字为用户(例如电子邮件、用户名、uuid)(电子邮件):>电子邮件这个程序需要哈希/检查用户密码?选择不如果不需要密码或将检查/散列由其他系统(如单点登录服务器)。这个程序需要吗哈希/检查用户密码?(yes / no)[是]:>是的创建:src /实体/用户。php创建:src /仓库/ UserRepository。php更新:src /实体/用户。php更新:配置/包/ security.yaml
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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
/ / src /实体/ User.php名称空间应用程序\实体;使用应用程序\存储库\UserRepository;使用学说\ORM\映射作为ORM;使用欧宝娱乐app下载地址\组件\安全\核心\用户\PasswordAuthenticatedUserInterface;使用欧宝娱乐app下载地址\组件\安全\核心\用户\用户界面;/ * * *@ORM\实体(repositoryClass = UserRepository::类)* /类用户实现了用户界面,PasswordAuthenticatedUserInterface{/ * * *@ORM\ Id *@ORM\ GeneratedValue *@ORM\列(类型=“整数”)* /私人美元id;/ * * *@ORM\列(类型=“字符串”,长度= 180,独特的= true) * /私人美元电子邮件;/ * * *@ORM\列(type = " json ") * /私人美元角色= [];/ * * *@var字符串哈希密码*@ORM\列(type = "字符串")* /私人美元密码;公共函数getId():哦?int{返回美元这- >id;}公共函数getEmail():哦?字符串{返回美元这- >电子邮件;}公共函数setEmail(字符串美元电子邮件):自我{美元这- >电子邮件=美元电子邮件;返回美元这;}/ * * *的公众表示用户(如用户名、电子邮件地址等)* *@see用户界面* /公共函数getUserIdentifier():字符串{返回(字符串)美元这- >电子邮件;}/ * * *@deprecated因为Symf欧宝娱乐app下载地址ony 5.3 * /公共函数getUsername():字符串{返回(字符串)美元这- >电子邮件;}/ * * *@see用户界面* /公共函数将getRoles():数组{美元角色=美元这- >角色;/ /保证每个用户至少ROLE_USER美元角色[]=“ROLE_USER”;返回array_unique (美元角色);}公共函数setRoles(数组美元角色):自我{美元这- >角色=美元角色;返回美元这;}/ * * *@seePasswordAuthenticatedUserInterface * /公共函数getPassword():字符串{返回美元这- >密码;}公共函数向setPassword(字符串美元密码):自我{美元这- >密码=美元密码;返回美元这;}/ * * *只需要返回一个盐,如果你不使用现代*散列算法security.yaml(如bcrypt或钠)。* *@see用户界面* /公共函数getSalt():哦?字符串{返回零;}/ * * *@see用户界面* /公共函数eraseCredentials(){/ /如果你存储任何暂时的,用户敏感数据,清晰的在这里/ / $ this - > plainPassword =零;}}
5.3
的PasswordAuthenticatedUserInterface接口和getUserIdentifier ()
方法在Symfony 5.3中引入的。欧宝娱乐app下载地址
如果您的用户是一个教义实体,就像在上面的示例中,别忘了创建表创建和运行迁移:
1 2
美元php bin /控制台:迁移美元php bin /控制台学说:迁移:迁移
加载用户:用户提供者
除了创建实体:用户
命令还增加了用户配置提供程序在你的安全配置:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9
#配置/包/ security.yaml安全:#……提供者:app_user_provider:实体:类:应用实体\ \用户属性:电子邮件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
< !——配置/包/安全。xml - - >< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><srv:容器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/services”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/security //www.oldmanjams.com/schema/dic/security/security-1.0.xsd”><配置>< !——……- - ><提供者的名字=“app_user_provider”><实体类=“应用程序实体\ \用户”财产=“电子邮件”/ >< /提供者>< /配置>< /srv:容器>
1 2 3 4 5 6 7 8 9 10 11 12 13
/ /配置/包/ security.php使用应用程序\实体\用户;使用欧宝娱乐app下载地址\配置\SecurityConfig;返回静态函数(SecurityConfig美元安全){/ /……美元安全- >提供者(“app_user_provider”)- >实体()- >类(用户::类)- >属性(“电子邮件”);};
这个用户提供者知道如何(重新)从一个存储加载用户(例如,数据库)基于“用户标识符”(如用户的电子邮件地址或用户名)。上面的配置使用原则来加载用户
实体使用电子邮件
属性为“用户标识符”。
用户在几个地方使用提供者在安全生命周期:
- 加载用户基于一个标识符
- 在登录(或任何其他身份验证),提供商加载用户基于用户标识符。一些其他特性,比如用户模拟和记得我也用这个。
- 重新加载用户的会话
-
在每个请求的开始,从会话用户加载(除非你的防火墙
无状态的
)。提供者“刷新”用户(例如数据库查询了最新数据),以确保所有用户的信息是最新的(如果必要,用户de-authenticated /记录如果有改变)。看到安全关于这个过程的更多信息。
欧宝娱乐app下载地址Symfony提供了几个内置的用户提供者:
内置的用户提供涵盖最常见的应用程序需求,但是你还可以创建自己的定制用户提供者。
请注意
有时,您需要将用户提供者在另一个类(例如,在您的自定义身份验证)。所有用户提供者遵循这种模式的服务ID:security.user.provider.concrete。< your-provider-name >
(< your-provider-name >
配置是关键。app_user_provider
)。如果你只有一个用户提供者,您可以使用自动装配UserProviderInterfacetype-hint。
注册用户:哈希密码
许多应用程序需要用户登录密码。对于这些应用,SecurityBundle提供密码散列和验证功能。
首先,确保你的用户类实现PasswordAuthenticatedUserInterface:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /实体/ User.php/ /……使用欧宝娱乐app下载地址\组件\安全\核心\用户\PasswordAuthenticatedUserInterface;类用户实现了用户界面,PasswordAuthenticatedUserInterface{/ /……/ * * *@return字符串的哈希密码用户* /公共函数getPassword():字符串{返回美元这- >密码;}}
然后,配置哪些密码侍者应该用于这类。如果你的security.yaml
文件不是已经预先配置,然后:用户
你应该这样做:
- YAML
- XML
- PHP