【发布时间】:2021-09-20 13:21:02
【问题描述】:
我的 Symfony 项目中有五种类型的角色。
我想为每个角色创建限制,以便他们可以访问特定的路由。他们将无法访问其他路径。我想以一种有效的方式做到这一点,例如 Laravel 在访问路径中使用 middleware。 Symfony 中有这样的方法吗?
【问题讨论】:
标签: symfony routes middleware acl user-roles
我的 Symfony 项目中有五种类型的角色。
我想为每个角色创建限制,以便他们可以访问特定的路由。他们将无法访问其他路径。我想以一种有效的方式做到这一点,例如 Laravel 在访问路径中使用 middleware。 Symfony 中有这样的方法吗?
【问题讨论】:
标签: symfony routes middleware acl user-roles
你可以用不同的方式做到这一点,这取决于你的 Symfony 版本。
在旧的 Symfony 版本中,限制对某些路由的访问的最常见方法是在config/packages/security.yaml 中添加一些参数,例如:
access_control:
- { path: '^/agent', roles: ROLE_AGENT }
- { path: '^/profile', roles: ROLE_USER }
- { path: '^/admin', roles: ROLE_ADMIN }
- { path: '^/admin/statistics', roles: ROLE_SUPER_ADMIN }
此外,将角色层次结构定义到同一个文件config/packages/security.yaml 中是一种很好的做法:
`role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN`
因此,具有 SUPER_ADMIN_ROLE 的用户将有权访问仅限于 ROLE_ADMIN 的路由。
但是,我的建议是,如果您有几个部分来限制将一般访问角色定义到 config/packages/security.yaml 文件中,例如并定义我之前所说的角色层次结构:
access_control:
- { path: '^/admin', roles: ROLE_ADMIN }
- { path: '^/profile', roles: ROLE_USER }
然后感谢SensioFrameworkExtraBundle,使用注解限制其他路由,例如:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
/**
* Require ROLE_ADMIN_SYSTEMS for *every* controller method in this class.
*
* @IsGranted("ROLE_ADMIN_SYSTEMS")
*/
public function YourFunction() { }
有关更多信息,请查看非常清晰的官方 Symfony 文档。 Symfony Security official documentation
希望对您有所帮助,如果您还有其他疑问,请告诉我,
亲切的问候。
【讨论】: