【问题标题】:User Role based routes in SymfonySymfony 中基于用户角色的路由
【发布时间】:2021-09-20 13:21:02
【问题描述】:

我的 Symfony 项目中有五种类型的角色

我想为每个角色创建限制,以便他们可以访问特定的路由。他们将无法访问其他路径。我想以一种有效的方式做到这一点,例如 Laravel 在访问路径中使用 middlewareSymfony 中有这样的方法吗?

【问题讨论】:

标签: symfony routes middleware acl user-roles


【解决方案1】:

你可以用不同的方式做到这一点,这取决于你的 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

希望对您有所帮助,如果您还有其他疑问,请告诉我,

亲切的问候。

【讨论】:

  • 那么以 /admin 开头的路由,只有 admin 可以访问这些路由吗?就像如果路由是 admin/users 那么只有 Admin 才能检查用户列表?
  • 是的,Farhan 每个以 /admin 开头的子路由。例如。 /admin/users、/admin/analytics 等。具有 admin_role 的用户可以访问这些路由。如果你能支持我的回答,请给我点赞,谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-09-17
  • 2015-01-30
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 2016-06-12
  • 2012-01-01
  • 1970-01-01
相关资源
最近更新 更多