有没有办法获得给定 URL 的允许角色?

Is there a way to get allowed roles for a given URL?

我在 security.yml 中有一些规则,基本上告诉 symfony 应该允许哪些角色访问某些 route/url。 有没有办法在给定请求的代码中确定允许哪些角色? 我打算在事件侦听器中使用它。

您可以使用 use Symfony\Component\Security\Http\AccessMapInterface;

中的 AccessMap

AccessMap 包含您的 access_control 配置的映射。

您可以在监听器中轻松自动连接服务:

private AccessMapInterface $accessMap;
public function __construct(AccessMapInterface $accessMap)
{
    $this->accessMap = $accessMap;
}

别忘了注册服务:

#services.yaml
services:

    #...

    Symfony\Component\Security\Http\AccessMapInterface: '@security.access_map'

然后您可以使用AccessMap通过$this->accessMap->getPatterns($request)方法匹配您的请求并访问每个配置。

来自我的一个项目的示例:

Symfony\Component\Security\Http\AccessMap {#8567 ▼
  -map: array:7 [▼
    0 => array:3 [▼
      0 => Symfony\Component\HttpFoundation\RequestMatcher {#8547 ▼
        -path: "^/login"
        -host: null
        -port: null
        -methods: []
        -ips: []
        -attributes: []
        -schemes: []
      }
      1 => array:1 [▼
        0 => "PUBLIC_ACCESS"
      ]
      2 => null
    ]
    1 => array:3 [▶]
    2 => array:3 [▶]
    3 => array:3 [▶]
    4 => array:3 [▶]
    5 => array:3 [▶]
    6 => array:3 [▶]
  ]
}

让我们看看我的登录页面需要什么角色:

//$request is from my login page
dump($this->accessMap->getPatterns($request));

array:2 [▼
  0 => array:1 [▼
    0 => "PUBLIC_ACCESS"
  ]
  1 => null
]

因此应该很容易在您的侦听器中匹配您的请求,并使用包含您的请求所需角色的 getPatterns 结果。

如果你想访问不是你当前请求的特定路由配置,你可以这样做:

$this->accessMap->getPatterns(Request::create('/login', 'GET'));