保护管理后端

保护管理后端

管理后端界面应该只能由受信任的人访问。可以使用Symfony Security组件来保护网站的这个区域。欧宝娱乐app下载地址

定义用户实体

即使与会者不能在网站上创建自己的帐户,我们也将为管理员创建一个功能齐全的认证系统。因此,我们将只有一个用户,网站管理员。

第一步是定义用户实体。为了避免混淆,让我们命名它管理代替。

为了整合管理使用Symfony Securi欧宝娱乐app下载地址ty身份验证系统的实体,它需要遵循一些特定的要求。例如,它需要一个密码财产。

使用专用的:用户命令创建管理实体代替传统:实体一:

1
欧宝娱乐app下载地址symfony控制台make: Admin用户

回答交互问题:我们想使用Doctrine存储管理员(是的),使用用户名对于管理员的唯一显示名称,每个用户将有一个密码(是的).

生成的类包含如下方法将getRoles ()eraseCredentials (),以及Symfony身份验证系统所需的其他几个。欧宝娱乐app下载地址

属性中添加更多属性管理用户,使用:实体

让我们添加一个__toString ()方法,因为EasyAdmin喜欢这些:

12 3 4 5 6 7 8 9 10 11 12 13 14
——/ src /实体/ Admin.php+ + + b / src /实体/ Admin.php@@类Admin实现UserInterface, PasswordAuthenticatedUserInterface返回(string) $this->用户名;}+公共函数__toString():字符串+ {+返回$this->用户名;+}+/** * @查看UserInterface */

除了生成管理实体,该命令还更新了安全配置,以连接实体与认证系统:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
——/ config /包/ security.yaml+ + + b / config /包/ security.yaml@@ -5,14 +5,18 @@ security: 欧宝娱乐app下载地址Symfony\Component\ security \Core\User\PasswordAuthenticatedUserInterface: 'auto' # //www.oldmanjams.com/doc/current/security.html#loading-the-user-the-user-provider提供商:—users_in_memory: {memory: null}+ #用于从会话和其他功能中重新加载用户(例如switch_user)+ app_user_provider:+实体:+类:应用程序\实体\管理+属性:用户名防火墙:dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false main: lazy: true—provider: users_in_memory+ provider: app_user_provider#激活不同的身份验证方式# //www.oldmanjams.com/doc/current/securi欧宝娱乐app下载地址ty.html#the-firewall

我们让Symf欧宝娱乐app下载地址ony选择用于散列密码的最佳算法(该算法将随着时间的推移而发展)。

生成迁移并迁移数据库的时间:

1 2
欧宝娱乐app下载地址Symfony控制台make:迁移欧宝娱乐app下载地址Symfony控制台原则:迁移:migrate -n

生成Admin用户密码

我们不会开发专门的系统来创建管理帐户。同样,我们将只有一个管理员。登录将是管理我们需要生成密码散列。

选择App \实体\ Admin然后选择任何你喜欢的密码,并运行以下命令来生成密码哈希:

1
欧宝娱乐app下载地址Symfony控制台安全性:哈希密码
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
欧宝娱乐app下载地址Symfony密码散列效用  ============================= 输入你的密码散列:> ------------------ --------------------------------------------------------------------------------------------------- 键值  ------------------ --------------------------------------------------------------------------------------------------- 切肉机使用Symfony \ Pas欧宝娱乐app下载地址swordHasher \切肉机\ \组件MigratingPasswordHasher密码散列argon2id v = 19美元= 65536美元,t = 4, p = 1 BQG + jovPcunctc30xG5PxQ TiGbx451NKdo + g9vLtfkMy4KjASKSOcnNxjij4gTX1s美元  --------------------------------------------------------------------------------------------------------------------- ![注]使用自盐散列器:散列器生成自己的内置盐。[OK] Password hashing succeeded .密码散列成功

创建管理员

通过SQL语句插入admin用户:

1 2 3
欧宝娱乐app下载地址Symfony运行PSQL -c"INSERT INTO admin (id,用户名,角色,密码)\ VALUES (nextval('admin_id_seq'), 'admin', '[\"ROLE_ADMIN\"]', \ '\$argon2id\$v=19\$m=65536,t=4,p=1\$BQG+jovPcunctc30xG5PxQ\$TiGbx451NKdo+g9vLtfkMy4KjASKSOcnNxjij4gTX1s')"

的转义在密码列值中签名;全都逃脱!

配置安全认证

现在我们有了一个管理用户,我们可以保护管理后端。欧宝娱乐app下载地址Symfony支持多种身份验证策略。让我们用一个经典和流行的例子表单认证系统

运行:身份验证命令用于更新安全配置、生成登录模板和创建身份验证

1
欧宝娱乐app下载地址Symfony控制台制作:认证

选择1要生成登录表单验证器,请命名验证器类AppAuthenticator,控制器SecurityController,并生成/注销URL (是的).

该命令更新了安全配置,以连接生成的类:

12 3 4 5 6 7 8 9 10 11 12 13 14
——/ config /包/ security.yaml+ + + b / config /包/ security.yaml@@ -17,6 +17,11 @@ security: main: lazy: true provider: app_user_provider+ custom_authenticator: App\Security\AppAuthenticator+注销:+ path: app_logout注销后重定向的位置+ #目标:app_any_route#激活不同的身份验证方式# //www.oldmanjams.com/doc/current/securi欧宝娱乐app下载地址ty.html#the-firewall

命令的回显信息提示,我们需要自定义路由onAuthenticationSuccess ()方法在用户成功登录时重定向用户:

12 3 4 5 6 7 8 9 10 11 12 13
——/ src /安全/ AppAuthenticator.php+ + + b / src /安全/ AppAuthenticator.php@@类AppAuthenticator扩展AbstractLoginFormAuthenticator返回新的重定向响应($targetPath);}- //例如:- //返回新的重定向响应($this->urlGenerator->generate('some_route'));-抛出新的\Exception('TODO:提供一个有效的重定向内部'.__FILE__);+返回新的重定向响应($this->urlGenerator->generate('admin'));} protected函数getLoginUrl(请求$ Request):字符串

提示

我怎么记得EasyAdmin路由是管理(如在应用程序控制器\ \ Admin \ DashboardController)?我不喜欢。你可以看一下这个文件,但是你也可以运行下面的命令来显示路由名称和路径之间的关联:

1
欧宝娱乐app下载地址Symfony控制台调试:路由器

添加授权访问控制规则

一个安防系统由两部分组成:身份验证而且授权.在创建admin用户时,我们给了他们ROLE_ADMIN的角色。让我们限制/管理节中添加规则,将具有此角色的用户添加到access_control

1 2 3 4 5 6 7 8 9 10 11
——/ config /包/ security.yaml+ + + b / config /包/ security.yaml@@ -31,7 +31,7 @@ security: #控制站点大区域访问的简单方法#注意:只有匹配的*第一个*访问控制将被使用access_control:- # - {path: ^/admin, roles: ROLE_ADMIN}+ - {path: ^/admin, roles: ROLE_ADMIN}# - {path: ^/profile, roles: ROLE_USER} when@test:

access_control规则通过正则表达式限制访问。试图访问以。开头的URL时/管理,安全系统将检查ROLE_ADMIN已登录用户的角色。

通过登录表单进行身份验证

如果您尝试访问管理后端,您现在应该被重定向到登录页面,并提示输入登录名和密码:

/登录/

使用登录管理以及您之前选择的明文密码。如果您完全复制了我的SQL命令,那么密码是管理

注意:EasyAdmin会自动识别Symfony认证系统:欧宝娱乐app下载地址

/管理/

试着点击“退出”链接。你有了!完全安全的后端管理员。

请注意

如果希望创建功能齐全的表单身份验证系统,请参阅:注册表单命令。

此工作,包括代码示例,是根据知识共享协议BY-NC-SA 4.0许可证。