symfony 在同一控制器中设置安全和开放操作的防火墙

vshtjzan  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(119)

我有一个API,我希望切换到使用symfony,到目前为止我看到的一个大挑战是防火墙非常严格,几乎每个示例都假设我希望保护所有/api或所有/secure,但我有一个控制器混合的情况。
例如,/user/create将在身份验证令牌下受到保护,但/user/webhook是一个公开可用的端点,不需要令牌即可访问。
我怎样才能让防火墙在这种设置下运行良好,而不需要改变一大堆端点呢?
理想情况下,symfony有一个auth属性,我可以标记到我希望被保护的动作,这样它就像路由一样被控制。
我希望使用symfony的最新版本(这篇文章是6.2)
感谢任何关于解决方案的指导。

2sbarzqh

2sbarzqh1#

您可以在security.yaml中使用regex指定access_control规则。顺序很重要,因此您需要指定从最具体(路径)到不太具体的规则:

# config/packages/security.yaml
security:

    # ...
    access_control:
        - { path: ^/user/create, roles: ROLE_ADMIN }
        - { path: ^/user, roles: PUBLIC_ACCESS }

在这种情况下,访问/user/createROLE_ADMIN是必需的。以/user开头的所有其他路径(如/user/webhook)都将是可访问的公共路径。您可以根据需要添加尽可能多的规则(请参阅https://symfony.com/doc/current/security.html#allowing-unsecured-access-i-e-anonymous-users)。
要使用另一种方法,如果您想直接在控制器中管理安全性,则可以使用特定的方法和属性:https://symfony.com/doc/current/security.html#securing-controllers-and-other-code

7lrncoxx

7lrncoxx2#

使用access_control是控制站点大部分内容访问的一种简单但有效的方法。
如果需要更细粒度的权限,可以为每个控制器或每个控制器类声明所需的权限。
例如:

use Symfony\Component\Security\Http\Attribute\IsGranted;

class PostController extends Controller
{
    #[IsGranted('ROLE_USER')]
    public function index()
    {
        // ...
    }
}

有关详细信息,请参见Using Expressions in Security Access Controls

相关问题